小编典典

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

all

有人可以向我解释一下模板方法模式和策略模式有什么区别吗?

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

然而,就客户而言,它们以完全相同的方式被消耗——这是正确的吗?


阅读 177

收藏
2022-07-14

共1个答案

小编典典

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

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

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

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

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

相反,策略模式允许在运行时通过包含来选择算法。具体算法由单独的类或函数实现,这些类或函数作为参数传递给策略的构造函数或 setter 方法。为此参数选择哪种算法可以根据程序的状态或输入动态变化。

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

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

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

总之:

  • 模板方法模式:通过子类化选择编译时算法
  • 策略模式:包含运行时算法选择
2022-07-14