你会选择哪种设计模式?

5
我希望设计一个包含实现目标的过程的类。为了确保最后一个方法“ExecuteIt”能正确执行,必须遵循一定的顺序。在这种情况下,您会使用什么设计模式?它可以确保用户按照某个顺序调用公共方法。
如果您真的不知道我在说什么,那么您可以分享一些选择设计模式的概念,或者在设计类时会考虑什么?

1
有没有具体的原因需要一个一个地调用这些方法? - Alex J
7个回答

6

@duffymo:模板方法也是GoF模式,而且比策略模式更符合描述。 - Michael Borgwardt
请问有哪位下投票的人可以解释一下为什么会下投票吗?这个回答哪里有问题? - Oded

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
我需要澄清一下 - 我并不是说设计模式是无用的。当涉及到可重用性和组合时,它们是计算机科学最好的东西之一。然而,这需要你单独了解组合、继承和多态性(以及较小程度上的内聚性和耦合性等概念)。一个能够有效使用设计模式的人,是那些能够基于上述概念严格提出解决方案的人。设计模式给你提供了一个文档化的结构,但在使用它们之前,你需要有一个坚实的基础。 - luis.espinal

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使用的语义是由其语法明确强制执行的。保持简单。


这个设计模式有一个名称吗? - ALOToverflow
Frank,它没有我知道的名字。但是“类型系统设计模式”可能可以。 - Vlad Gudim
我认为这是装饰器模式,但由于在我的类中我只做一件事,所以使用多个类可能不是那么好。 - MemoryLeak

2
我认为你不需要真正执行任何操作,只需准备语句、资源和其他所需内容。这样,无论用户调用方法的顺序如何,实际执行都将被保证有序;这是因为在执行之前,您完全掌控了实际执行过程。
在我看来,“模板方法”与您的目标关系甚微。
编辑: 更明确地说,使您的类具有一个公共方法“Execute”,以及一些其他公共方法,告诉您的类要做什么(何时执行是您的责任,而不是用户的责任);然后编写一些私有方法来执行实际工作,它们将由您的“Execute”按正确的顺序调用,一旦用户完成设置。
给用户设置的能力,让执行留给您自己。他告诉您什么,您决定如何执行。

还有一些其他的公共方法可以告诉你的类该做什么(何时做是你的责任,而不是用户的责任);你能详细解释一下吗? - MemoryLeak

0
作为一个通用的概念,你应该选择模式作为标准解决方案来解决标准问题,所以我同意Oded的看法,“模板方法”似乎符合你的需求(但是你解释得可能太少了)。 不要把模式当作“神器”,你需要记住的是:
  1. 如何用标准方法解决我的问题?
  2. 有没有这样的标准模式?
  3. 这是最简单的方式吗?

0

如果你有一个类层次结构,并且基类在其公共模板方法中定义了受保护的操作步骤,那么模板方法是合理的。您能详细说明您的问题吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接