确定方法调用顺序的接口设计模式
Design pattern for interface that determines order of method invocation
我想用一些方法创建一个 Java 接口。但我希望接口的用户只能按照我定义的顺序或顺序调用方法。例如 buyTicket()
不应在 reserveTicket()
之前调用。 问:是否有设计模式或任何提示可以解决这个问题?
我考虑过:
A)
- 界面已包装,仅显示下一个可能的方法。每次调用一个方法 returns 一个新的
operation
可以在它之后调用,依此类推。
- 所以
ReserveTicketOperation
有 public BuyTicketOperation execute();
- 然后
BuyTicketOperation
有 public RenderTicketOperation execute();
B)
- 使用某种
context
状态机,它使用枚举记录执行的位置,并有一个工厂来获取下一个操作。
非常感谢任何想法或建议。谢谢
我的直觉:这就是根本不做的模式。
如果您的方法的内部逻辑要求它们始终按特定顺序调用它们;那么您将公开一个实现细节,这将使使用您的界面做错事变得非常容易。
含义:与其试图以某种方式强制您的 "client code" 遵守某些特定的顺序,您应该以客户端代码不需要关心的方式设计您的界面 "order"。
在您的特定示例中,问题似乎是票证对象可以是 "reserved" 或 "bought";当然,只有 "bought" 票可以退票、退款……
在这种情况下,对于 "reserved" 票和 "bought" 票,"solution" 实际上可能有 不同的 类 .那么您就不必担心有人试图退还一张只有 "reserved".
的机票
呃,这个问题的答案很简单,四人帮23人中已经有一个模式了:Template Method.
整个想法是,您正在准确地编纂您所谈论的一系列操作,但您允许每个单独的操作,用迈耶的术语 'open to extension.'
如果您直到运行时才确定这些操作是什么,那么 TM 将无法工作。
看看 Fluent Builder 模式。
这里有一个例子。
http://blog.crisp.se/2013/10/09/perlundholm/another-builder-pattern-for-java
这个想法是你有一个 'tree of allowable methods'。树的每一层都在一个接口中定义。所以你有一个 'order of interfaces'。每个接口中的所有方法都完成它们的工作(必须为空),然后 returns 另一个接口,对应于树的下一层。
也许 Template Method Pattern,其中您的 public 接口在 public 方法中定义算法的程序框架,称为模板方法,它将一些步骤推迟到私有方法。
或者 Command Pattern,其中
an object is used to represent and encapsulate all the information
needed to call a method at a later time. This information includes the
method name, the object that owns the method and values for the method
parameters.
我想用一些方法创建一个 Java 接口。但我希望接口的用户只能按照我定义的顺序或顺序调用方法。例如 buyTicket()
不应在 reserveTicket()
之前调用。 问:是否有设计模式或任何提示可以解决这个问题?
我考虑过:
A)
- 界面已包装,仅显示下一个可能的方法。每次调用一个方法 returns 一个新的
operation
可以在它之后调用,依此类推。 - 所以
ReserveTicketOperation
有public BuyTicketOperation execute();
- 然后
BuyTicketOperation
有public RenderTicketOperation execute();
- 界面已包装,仅显示下一个可能的方法。每次调用一个方法 returns 一个新的
B)
- 使用某种
context
状态机,它使用枚举记录执行的位置,并有一个工厂来获取下一个操作。
- 使用某种
非常感谢任何想法或建议。谢谢
我的直觉:这就是根本不做的模式。
如果您的方法的内部逻辑要求它们始终按特定顺序调用它们;那么您将公开一个实现细节,这将使使用您的界面做错事变得非常容易。
含义:与其试图以某种方式强制您的 "client code" 遵守某些特定的顺序,您应该以客户端代码不需要关心的方式设计您的界面 "order"。
在您的特定示例中,问题似乎是票证对象可以是 "reserved" 或 "bought";当然,只有 "bought" 票可以退票、退款……
在这种情况下,对于 "reserved" 票和 "bought" 票,"solution" 实际上可能有 不同的 类 .那么您就不必担心有人试图退还一张只有 "reserved".
的机票呃,这个问题的答案很简单,四人帮23人中已经有一个模式了:Template Method.
整个想法是,您正在准确地编纂您所谈论的一系列操作,但您允许每个单独的操作,用迈耶的术语 'open to extension.'
如果您直到运行时才确定这些操作是什么,那么 TM 将无法工作。
看看 Fluent Builder 模式。
这里有一个例子。
http://blog.crisp.se/2013/10/09/perlundholm/another-builder-pattern-for-java
这个想法是你有一个 'tree of allowable methods'。树的每一层都在一个接口中定义。所以你有一个 'order of interfaces'。每个接口中的所有方法都完成它们的工作(必须为空),然后 returns 另一个接口,对应于树的下一层。
也许 Template Method Pattern,其中您的 public 接口在 public 方法中定义算法的程序框架,称为模板方法,它将一些步骤推迟到私有方法。
或者 Command Pattern,其中
an object is used to represent and encapsulate all the information needed to call a method at a later time. This information includes the method name, the object that owns the method and values for the method parameters.