模板方法模式
定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
角色扮演
具体子类(RealClass)
由子类实现的方法,并且在模板方法中被调用
抽象模板类(AbstranctClass)
是一个或者多个,一般是一个具体方法/框架,实现对基本方法的调度,来完成固定的业务逻辑
举例说明
现在某明星要开一场演唱会,那么久有如下基本预备工作,1.与经纪公司洽谈合作2.筹备阶段(场地、时间。。。)3.宣传工作(要赚钱啊),主要阶段如上,但是仅是是一场演唱会,而存在哪位明星,哪家经纪公司,地点、时间等不定因素,但是流程是一致的,这也说明模板是一个框架。
//抽象模板类
class AbstranctClass
{
public:
AbstranctClass();
virtual ~AbstranctClass();
void process(){
cout<< "开场演唱会---"<< endl;
cout<<"-----------------"<<endl;
cout<<"-----------------"<<endl;
funcA();
funcB();
funcC();
}
virtual void funcA() = 0;
virtual void funcB() = 0;
virtual void funcC() = 0;
protected:
private:
};
//具体实现子类
class RealClass :public AbstranctClass
{
public:
RealClass();
virtual ~RealClass();
void funcA(){
cout << "洽谈阶段---明星A与公司B" << endl;
}
void funcB(){
cout << "筹备阶段---地点:成都:时间:2018:09:12" << endl;
}
void funcC(){
cout << "宣传阶段---赞助商C。。" << endl;
}
protected:
private:
};
demo:
int main(){
AbstranctClass *abstran = new RealClass();
abstran->process();
return 0;
}
结果:
优点
1:具体细节步骤由子类实现,子类定义详细的处理逻辑不会改变整个框架结构
2.:代码复用的基本 技术,在数据库设计中尤为重要
3:存在一种反向的控制结构,通过一个父类调用其子类的造作,通过子类对父类进行扩展和实现,完全符合开闭原则
缺点
每个不同的实现都需要定义一个子类,会导致类的个数增加,系统更加庞大。
应用场景
多个子类有共有的方法,并且逻辑相同/逻辑相同,细节有差异
对重要,复杂的算法,可以讲核心算法设计为模板方法,周边细节由子类实现
重构时,经常使用的方案,将相同的代码抽象到父类,通过钩子函数约束行为。