模板方法模式主要有一下几个要点:
(1)将算法的框架放在父类中,算法的步骤延迟到子类,不同的子类可以对算法的步骤进行不同处理。
(2)算法流程中可以放置一个钩子(hook()),子类可以实现钩子函数,进行条件控制,由子类来控制算法某个步骤是否执行。
eg. sort()中可供用户定义的compare函数。
class AbstractClass
{
public:
void TemplateMethod() final // final:(1)修饰类:防止类的继承。(2)修饰成员函数:防止子类覆盖
{
operation1();
operation2();
operation3();
if(hook())
{
operation3();
}
}
virtual void operation1(){//可以由子类实现...};
virtual void operation3(){//可以由子类实现...};
void operation2() final { //具体实现...};
virtual bool hook(){//可以由子类实现};
};
class concreteClass : public AbstractClass
{
public:
virtual void operation1(){...};
virtual void operation3(){...};
virtual bool hook(){...};
};
模板方法与其他模式的比较:
(1)策略模式:替换算法
(2)工厂方法:子类决定创建哪个对象
设计原则:
抽象类说:不要调用我,我会调用你。避免高层组件和底层组件具有明显环形依赖。