【问题标题】:What design pattern will you choose?你会选择什么设计模式?
【发布时间】:2010-04-01 09:49:31
【问题描述】:

我想设计一个类,其中包含实现某个目标的过程。 它必须遵循某种顺序来确保最后一个方法,比如“ExecuteIt”,能够正确运行。 在这种情况下,你会使用什么设计模式? 这可以确保用户必须按照某种顺序调用公共方法。

如果你真的不知道我在说什么,那么你能分享一些选择设计模式的概念,或者你在设计课程时会考虑什么?

【问题讨论】:

  • 方法需要一个一个调用有什么具体原因吗?

标签: c# java design-patterns class


【解决方案1】:

我相信您正在寻找Template Method 模式。

【讨论】:

  • @duffymo:模板方法也是一种GoF模式,比策略更符合描述
  • 能否请任何反对票解释他们为什么反对?这个答案有什么问题?
【解决方案2】:

模板方法是你想要的。它是最古老的一种,只是一种组成类的方式的形式化。

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 ...}
}

但您似乎在寻找使用模式的机会,而不是使用模式来解决特定类型的问题。那只会导致你养成不良的软件开发习惯。

不要考虑模式。想想如何在没有模式的情况下解决特定问题。

想象一下,没有经过编码的模式(以前​​就是这样)。您将如何在这里完成您想做的事情(这是人们为解决此类问题所做的事情。)当您可以做到时,您将能够更好地理解模式。

不要将它们用作千篇一律的工具。这是你最不想做的事情。

【讨论】:

  • 我需要澄清这一点——我并不是说模式没有用。当涉及到可重用性和组合时,它们是计算机科学提出的最好的东西之一。但是,它要求您自己了解组合、继承和多态性(以及在较小程度上了解内聚和耦合等概念)。知道如何有效使用模式的人就是知道如何提出解决方案的人。严格基于上述概念。模式为您提供了文档化的结构,但您需要有坚实的基础才能使用它们。
【解决方案3】:

它基本上不是一种模式,但是:如果你想确保代码/方法按特定顺序执行,请使类只有一个公共方法,然后以正确的顺序调用非公共方法.

【讨论】:

    【解决方案4】:

    在任何 API 中强制执行特定步骤序列的简单而实用的方法是定义一个类集合(而不仅仅是一个类),这样每个下一个有效步骤都将一个从前一个有效步骤派生的对象作为参数步骤,即:

       Fuel   coal   = CoalMine.getCoal();
       Cooker stove  = new Cooker (gas); 
    
       Filling apple = new AppleFilling();
       Pie applePie = new Pie(apple);
    
       applePie.bake(stove);
    

    也就是说,要烤一个馅饼,您需要提供一个 Cooker 对象,而该对象又需要先实例化某种合适的燃料。同样,在您获得馅饼的实例之前,您需要准备一些馅料。

    在这种情况下,API 使用的语义由其语法明确强制执行。保持简单。

    【讨论】:

    • 这种设计模式有名字吗?
    • 弗兰克,它没有我知道的名字。但是“类型系统设计模式”可以做到。
    • 我觉得是装饰器模式,但是因为在我的课堂上我只做一件事,所以我觉得使用多个类不太好
    【解决方案5】:

    我认为您不必真正执行任何操作,只需准备语句、资源和您想要的任何东西。 这样,无论用户调用方法的顺序是什么,都可以确保实际执行是有序的;仅仅是因为您可以完全控制实际执行,就在执行之前。

    恕我直言,模板方法与您的目标几乎没有关系。

    编辑: 更清楚。让你的类有一个公共方法 Execute,以及一些其他公共方法来告诉你的类做什么(什么时候做是你的责任,而不是用户的责任);然后创建一些私有方法来完成真正的工作,一旦用户完成设置,它们将由您的 Execute 以正确的顺序调用。

    赋予用户设定的能力,为自己保持执行。他说什么,你决定怎么做。

    【讨论】:

    • 和其他一些公共方法来告诉你的班级做什么(什么时候做是你的责任,而不是用户的责任);你能详细解释一下吗?
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      作为一般概念,您应该选择一个模式作为标准问题的标准解决方案,因此,我同意 Oded“模板方法” 似乎适合您的需求(但你解释的可能太少了)。 不要将模式用作“恋物癖”,您要记住的是:

      1. 如何以标准方式解决我的问题?
      2. 有这样的模式吗?
      3. 这是最简单的方法吗?

      【讨论】: