我想用数字方法创建一个Java接口。但我希望接口的用户只能调用我定义的顺序或顺序中的方法。例如,buyTicket()
之前不应调用reserveTicket()
。 问:是否有设计模式或有关如何解决这个问题的提示?
我考虑过:
A)
operation
,可以在它之后调用,依此类推。ReserveTicketOperation
有public BuyTicketOperation execute();
BuyTicketOperation
有public RenderTicketOperation execute();
B)
context
状态机,使用枚举记录执行位置,并有一个工厂用于获取下一个操作。非常感谢任何想法或建议。感谢
答案 0 :(得分:3)
查看Fluent Builder模式。
这方面的一个例子是。
http://blog.crisp.se/2013/10/09/perlundholm/another-builder-pattern-for-java
这个想法是你有一个允许方法的树'。树的每个级别都在一个界面中定义。所以你有一个'接口顺序'。每个接口中的所有方法都完成它们的工作(必须是无效的),然后返回另一个接口,对应于树的下一层。
答案 1 :(得分:2)
我的直接感受:这是根本不做模式。
如果您的方法的内在逻辑要求他们始终按特定顺序调用它们;然后,您将公开一个实现细节,使您可以非常轻松地使用您的界面做错事。
含义:而不是试图以某种方式强制您的客户代码"为了遵守某些特定的顺序,您应该以客户端代码不需要关心的方式设计您的接口" order"。
在您的特定示例中,问题似乎是票证对象可以被保留"或"买了#34 ;;当然,只有"买了#34;门票可以退回,退款,......
在这种情况下,"解决方案"可能实际上有不同的类用于"保留"门票和"买了"门票。那么你不必担心有人会试图退还一张只有"保留"。
的票。答案 2 :(得分:2)
呃,这个问题的答案很简单:四人帮中的23个已经存在一种模式:Template Method。
整个想法是,你正在准确地描述你正在谈论的一系列操作,但你允许每个单独的操作,以迈耶的术语“开放延伸。”
如果您不确定这些操作在运行时之前是什么,那么TM将无法工作。
答案 3 :(得分:2)
也许Template Method Pattern,您的公共接口在公共方法中定义算法的程序框架,称为模板方法,它将某些步骤推迟到私有方法。
或许Command Pattern,其中
一个对象用于表示和封装所有信息 需要稍后调用方法。这些信息包括 方法名称,拥有方法的对象和方法的值 参数。