模板方法
定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
就是说一个算法中间又可以分为很逗步骤,但是流程是固定的就可以使用该模式。由于算法的流程是一个不变的那么就应该把其抽象出来,用子类去实现过程的实现
例如:某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程受欢迎程度比较低,希望将这几个表演流程创新,以尝试迭代更新表演流程;
直接上代码,下面这个是普通的写法,
#include <iostream>
using namespace std;
class ZooShow {
public:
void Show0(){
cout << "show0" << endl;
}
void Show2(){
cout << "show2" << endl;
}
};
class ZooShowEx {
public:
void Show1(){
cout << "show1" << endl;
}
void Show3(){
cout << "show3" << endl;
}
};
int main () {
ZooShow *zs = new ZooShow;
ZooShowEx *zs1 = new ZooShowEx;
// 流程是固定的(稳定点),应该抽象出来;另外子流程是不应该暴露给客户,违反了接口隔离原则;
zs->Show0();
zs1->Show1();
zs->Show2();
zs1->Show3();
return 0;
}
//可以看出来很挫,每个步骤手动调用
由于是固定的算法流程是固定的,我们可以将算法的流程抽象出来
#include <iostream>
using namespace std;
class ZooShow {
protected:
virtual void Show0(){
cout << "show0" << endl;
}
virtual void Show2(){
cout << "show2" << endl;
}
virtual void Show1(){
}
virtual void Show3(){
}
public:
void show(){
Show0();
Show1();
Show2();
Show3();
}
};
class ZooShowEx : public ZooShow{
protected:
virtual void Show1(){
cout << "show1" << endl;
}
virtual void Show3(){
cout << "show3" << endl;
}
};
class ZooShowEx1 : public ZooShow{
protected:
virtual void Show2(){
cout << "show2+++" << endl;
}
virtual void Show0(){
cout << "show0---" << endl;
}
virtual void Show1(){
cout << "show0~~~" << endl;
}
};
int main () {
ZooShow *zs = new ZooShowEx;
ZooShow *zs1 = new ZooShowEx1;
zs->show();
zs1->show();
}
使用多态,让接口在子类中实现,同时使用protected限定方法,让子类中无法使用该方法,只有在父类中才可以调用。
总结: 通过算法骨架来约束子类的方法
模板方法模式是一种设计模式,用于定义算法的骨架并允许子类替换具体步骤。通过将固定算法流程抽象出来,子类可以在不改变整体结构的情况下重定义部分行为。博客中展示了如何使用模板方法模式改进动物园表演流程,使得流程控制在父类中,而具体的表演细节由子类实现,从而实现多态和接口隔离。
1275

被折叠的 条评论
为什么被折叠?



