模板方法
定义
定义⼀个操作中的算法的⻣架 ,⽽将⼀些步骤延迟到⼦类中。 Template Method使得⼦类可以不改变⼀个算法的结构即可重定义该算法的某些特定步骤。 ——《 设计模式》 GoF
本质:通过固定算法⻣架来约束⼦类的⾏为;
应用场景
-
具有统一的操作步骤或操作过程
-
具有不同的操作细节
-
存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同
案例
背景
某个品牌动物园,有⼀套固定的表演流程,但是其中有若⼲个表演⼦流程受欢迎程度比较低,希望
将这几个表演流程创新,以尝试迭代更新表演流程;
重构前的代码
类的框架
// 表演类1
class ZooShow {
public:
void Show0(){ // 表演流程1
cout << "show0" << endl;
}
void Show2(){ // 表演流程3
cout << "show2" << endl;
}
};
// 表演类2
class ZooShowEx {
public:
void Show1(){ // 表演流程2
cout << "show1" << endl;
}
void Show3(){ // 表演流程4
cout << "show3" << endl;
}
};
调用
ZooShow *zs = new ZooShow;
ZooShowEx *zs1 = new ZooShowEx;
// 流程是固定的(稳定点),应该抽象出来
// 另外子流程是不应该暴露给客户,违反了接口隔离原则;
zs->Show0();
zs1->Show1();
zs->Show2();
zs1->Show3();
重构类图
代码
稳定点
// 抽象类
class ZooShow {
public:
// 固定流程封装到这里
void Show() {
Show0();
Show1();
Show2();
Show3();
}
protected:
// 子流程 使用protected保护起来 不被客户调用 但允许子类扩展
virtual void Show0(){
cout << "show0" << endl;
}
virtual void Show2(){
cout << "show2" << endl;
}
virtual void Show1() {
}
virtual void Show3() {
}
};
变化点
// 表演类1
class ZooShowEx1 : public ZooShow {
protected:
virtual void Show1(){
cout << "show1" << endl;
}
virtual void Show3(){
cout << "show3" << endl;
}
};
// 表演类2
class ZooShowEx2 : public ZooShow {
protected:
virtual void Show0(){
cout << "show1" << endl;
}
virtual void Show2(){
cout << "show3" << endl;
}
};
// 表演类3
class ZooShowEx3 : public ZooShow {
protected:
virtual void Show1(){
cout << "show1" << endl;
}
virtual void Show3(){
cout << "show3" << endl;
Show4(); // 在重写的方法中调用新添加的这个表演方法
}
virtual void Show4() { // 新添加了一个表演类
// 实现...
}
};
调用(稳定)
ZooShow *zs = new ZooShowEx1;
ZooShow *zs = new ZooShowEx2;
ZooShow *zs = new ZooShowEx3; // 3种平行的表演方法
zs->Show();
return 0;