定义一个操作中的算法框架,而将一些步骤延迟到子类中,模版方法模式使得子类可以不改变算法结构即可重新定义算法的某些特定步骤
1.优点:
在父类中定义一个算法,而右它的子类来实现细节处理,在子类实现详细的处理算法并不会改变算法中步骤的执行顺序
模版方法模式是一种代码复用技术,他在类库中设计特别重要,它提取了类库中的公共行为,将公共行为放在父类,而通过其他子类来实现不同的行为,它鼓了我们恰当使用继承来实现代码复用
可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定是否需要执行
在模版方法模式中可以通过子类来覆盖父类的基本方法,不同子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责和开闭原则
2.缺点
灵活性较低:模板方法模式强制子类遵循父类定义的算法结构,子类只能在有限的步骤上进行扩展,难以完全改变算法的结构。
高耦合性:模板方法模式可能导致父类和子类之间的耦合性较高,任何对父类的修改都有可能影响到所有子类,从而增加了维护的难度。
#include<iostream>
using namespace std;class DrinkTemplate
{
public:virtual void BolidWater()=0;virtual void Brew()=0;virtual void PourCup()=0;virtual void AddSomething()=0;void Make(){BolidWater();Brew();PourCup();AddSomething();}
};class Coffee:public DrinkTemplate
{
public:virtual void Brew(){cout<<"冲泡咖啡"<<endl; }virtual void BolidWater(){cout<<"煮水"<<endl; }virtual void PourCup(){cout<<"咖啡倒入杯子中"<<endl; }virtual void AddSomething(){cout<<"加糖,加牛奶"<<endl; }
};class Tea: public DrinkTemplate
{
public:virtual void BolidWater(){cout<<"煮水"<<endl; }virtual void Brew(){cout<<"冲泡铁观音"<<endl; }virtual void PourCup(){cout<<"茶倒入杯子中"<<endl; }virtual void AddSomething(){cout<<"加蜂蜜"<<endl; }};void test()
{Tea * tea=new Tea;tea->Make();cout<<" "<<endl; Coffee *coffee=new Coffee;coffee->Make();}int main()
{test();return 0;
}