有人可以向我解释一下模板方法模式和策略模式有什么区别吗?
据我所知,它们 99% 是相同的——唯一的区别是模板方法模式有一个抽象类作为基类,而策略类使用由每个具体策略类实现的接口。
然而,就客户而言,它们以完全相同的方式被消耗——这是正确的吗?
两者的主要区别在于选择具体算法的时间。
使用模板方法模式,这通过子类化模板在编译时发生。每个子类通过实现模板的抽象方法来提供不同的具体算法。当客户端调用模板的外部接口的方法时,模板会根据需要调用其抽象方法(其内部接口)来调用算法。
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); } }