模板 是一个通俗的概念定义,PPT模板、Word模板、Excel模板,你能接触的模板有很多,模板其实就是一个 Example、一个框架,你根据这个例子去具体实现。
模板方法 的概念与此类似,在 抽象类中定义 算法的骨架,将具体内容 延迟到子类实现。
上面的这个图说明的比较清晰,我们通过代码再来看一下:
class AbstractClass
{
public:
// 模板方法,给出逻辑骨架,而逻辑的组成是相应的抽象操作,它们推迟到子类去实现
void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
PrimitiveOperation3();
}
protected:
// 一些抽象行为,放到子类去实现
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
virtual void PrimitiveOperation3();
};
// 具体类A,实现了抽象类中的特定步骤
class ConcreteClassA : AbstractClass
{
protected:
virtual void PrimitiveOperation1()
{
// ……
}
virtual void PrimitiveOperation2()
{
// ……
}
virtual void PrimitiveOperation3()
{
// ……
}
};
// 具体类B,实现了抽象类中的特定步骤 - 与A不同
class ConcreteClassB : AbstractClass
{
protected:
virtual void PrimitiveOperation1()
{
// 与ConcreteClassA不同
}
virtual void PrimitiveOperation2()
{
// 与ConcreteClassA不同
}
virtual void PrimitiveOperation3()
{
// 与ConcreteClassA不同
}
};
模板方法 通过继承来实现方法的扩展,这种思路比较重要的意义在于能够对算法的轮廓进行 划分,能够有效分离出主次,方便从整体到局部的扩展。
在程序的主框架相同、细节不同的情况下,可以考虑使用模板方法。