模板方法和策略模式有什么区别?

有人可以向我解释模板方法模式和策略模式之间的区别是什么?

据我可以告诉他们99%是相同的 - 唯一的区别是模板方法模式具有作为基类的抽象类,而策略类使用由每个具体策略类实现的接口。

然而,就客户而言,他们的消费方式完全相同 - 这是正确的吗?


两者的主要区别在于具体算法的选择。

通过模板方法模式,这通过子类化模板在编译时发生。 每个子类通过实现模板的抽象方法提供了不同的具体算法。 当客户端调用模板外部接口的方法时,模板根据需要调用其抽象方法(其内部接口)来调用算法。

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

相比之下, 策略模式允许在运行时通过遏制来选择算法。 具体的算法是通过单独的类或函数来实现的,这些类或函数作为其构造函数或设置方法的参数传递给策略。 该参数选择哪种算法可以根据程序的状态或输入动态变化。

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

综上所述:

  • 模板方法模式:通过子类化来 编译时间算法选择
  • 策略模式:通过遏制 运行时算法选择

  • 模板模式用于特定操作具有一些不变的行为,这些行为可以用其他不同的原始行为来定义。 抽象类定义了不变行为,而实现类定义了依赖方法。 在一个策略中,行为实现是独立的 - 每个实现类定义了行为,并且它们之间没有共享代码。 两者都是行为模式,因此,客户以同样的方式消费。 通常,策略具有单一的公共方法 - execute()方法,而模板可以定义一组公共方法以及一组子类必须实现的支持私有基元。

    这两种模式可以很容易地一起使用。 您可能有一个策略模式,其中几个实现属于使用模板模式实现的一系列策略。


    你可能意思是模板方法模式。 你是对的,他们服务于非常相似的需求。 我认为最好在模板方法中使用模板方法,当你有一个“模板”算法已经定义了一些步骤,其中子类覆盖这些步骤来改变一些细节。 在策略的情况下,您需要创建一个接口,而不是使用继承来使用委派。 我会说这是一个更强大的模式,也许根据DIP依赖倒置原则更好。 它更强大,因为你清楚地定义了一个新的策略抽象 - 一种做事的方式,它不适用于模板方法。 所以,如果这种抽象是有道理的 - 使用它。 但是,使用模板方法可以在简单情况下为您提供更简单的设计,这也很重要。 考虑哪个词更适合:你有模板算法吗? 或者在这里关键的是你有一个抽象的策略 - 一种新的做事方式

    模板方法的示例:

    Application.main()
    {
    Init();
    Run();
    Done();
    }
    

    在这里,您从应用程序继承,并替换init,run和done中完成的任务。

    策略示例:

    array.sort (IComparer<T> comparer)
    

    在这里,当写一个比较器时,你不会从一个数组继承。 数组将比较算法委托给比较器。

    链接地址: http://www.djcxy.com/p/85117.html

    上一篇: What is the difference between the template method and the strategy patterns?

    下一篇: Jenkins pipeline builds jobs on Gitlab push