模板模式:
提到模板,可能大多数人想到的是"简历模板"、“论文模板"等,比如我们要写简历时,会从网上下载一份漂亮的简历模板,其格式是固定的,我们根据自己的情况填充不同的内容。模板模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板模式的角色:
- 模板方法(AbstractClass):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作;
- 模板方法的具体实现(ConcreteClass):实现父类所定义的一个或多个抽象方法。
优点:
- 封装不变部分,扩展可变部分,符合OCP原则;
- 提取公共代码,便于维护;
- 行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
eg:
class AbstractClass {
public:
AbstractClass();
virtual ~AbstractClass();
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
void TemplateMethod(){
PrimitiveOperation1();
PrimitiveOperation2();
}
};
//-------------------------------------
class ConcreteClassA : public AbstractClass{
public:
ConcreteClassA();
virtual ~ConcreteClassA();
void PrimitiveOperation1(){
cout<<"ConcreteClassA PrimitiveOperation1"<<endl;
}
void PrimitiveOperation2(){
cout<<"ConcreteClassA PrimitiveOperation2"<<endl;
}
};
class ConcreteClassB : public AbstractClass{
public:
ConcreteClassB();
virtual ~ConcreteClassB();
void PrimitiveOperation1(){
cout<<"ConcreteClassB PrimitiveOperation1"<<endl;
}
void PrimitiveOperation2(){
cout<<"ConcreteClassB PrimitiveOperation2"<<endl;
}
};
//-------------------------------------
//use
AbstractClass * p = new ConcreteClassA();
p->TemplateMethod();