我想设计一个类,其中包含一个实现目标的过程。 它必须遵循一些顺序,以确保最后一个方法,让我们说“ExecuteIt”,以正确行事。 在这种情况下,你会使用什么设计模式? 这可以确保用户必须按照某种顺序调用公共方法。
如果你真的不知道我在说什么,那么你能否分享一些选择设计模式的概念,或者在设计课程时你会考虑什么?
答案 0 :(得分:6)
我相信你正在寻找Template Method
模式。
答案 1 :(得分:4)
模板方法就是你想要的。它是最古老的,也就是组成课程的方式的正式化。
http://en.wikipedia.org/wiki/Template_method_pattern
或在此代码示例中:
abstract class AbstractParent // this is the template class
{
// this is the template method that enforces an order of method execution
final void executeIt()
{
doBefore(); // << to be implemented by subclasses
doInTheMiddle() // also to be implemented by subclasses
doLast(); // << the one you want to make sure gets executed last
}
abstract void doBefore();
abstract void doInTheMiddle();
final void doLast(){ .... }
}
class SubA extends AbstractParent
{
void doBefore(){ ... does something ...}
void doInTheMiddle(){ ... does something ...}
}
class SubB extends SubA
{
void doBefore(){ ... does something different ...}
}
但似乎你正在寻找使用模式的机会,而不是使用模式来解决特定类型的问题。这只会导致你不良的软件开发习惯。
不要考虑模式。想想 你 如何在没有模式的情况下解决特定问题。
想象一下,没有编纂的模式(以前是这样的)。你将如何完成你想要做的事情(这是人们为解决这类问题所做的工作。)当你能做到这一点时,你就会更好地理解模式。
不要将它们用作饼干切割器。这是你想做的最后一件事。
答案 2 :(得分:3)
它基本上不是模式,但是:如果你想确定,代码/方法按特定顺序执行,使类只有一个公共方法,然后以正确的顺序调用非公共方法
答案 3 :(得分:3)
在任何API中强制执行特定步骤序列的简单实用方法是定义一组类(而不是仅仅一个类),使得每个下一个有效步骤都将从前一个派生的对象作为参数。步骤,即:
Fuel coal = CoalMine.getCoal();
Cooker stove = new Cooker (gas);
Filling apple = new AppleFilling();
Pie applePie = new Pie(apple);
applePie.bake(stove);
也就是说,要烤一个馅饼,你需要提供一个Cooker对象,而这个对象又要求某种合适的燃料首先被实例化。同样地,在你获得一个Pie的实例之前,你需要准备一些Filling。
在这个实例中,API使用的语义由其语法明确强制执行。保持简单。
答案 4 :(得分:2)
我认为你不必真正执行任何事情,只需准备语句,资源和任何你想要的东西。 这样,无论用户调用方法的顺序如何,都可以确保订购实际执行;只是因为你可以在执行之前完全控制实际执行。
恕我直言模板方法与您的目标关系不大。
编辑: 更清楚。让你的类有一个公共方法执行,以及许多其他公共方法来告诉你的班级该做什么(何时这样做是你的责任而不是用户的责任);然后让一些私人方法完成真正的工作,一旦用户完成设置,它们将由您的Execute以正确的顺序调用。
为用户提供设置,保持自我执行的能力。他告诉你什么,你决定如何。
答案 5 :(得分:0)
作为一般概念,您应该选择一种模式作为标准问题的标准解决方案,因此,我同意 Oded ,“模板方法”似乎符合您的需求(但你解释的可能太少了)。 不要将模式用作“恋物癖”,你必须记住的是:
答案 6 :(得分:0)
如果您有类层次结构,并且基类在其公共模板方法中定义受保护的操作步骤,则模板方法是合理的。你能详细说明一下你的问题吗?