定义:
模板模式提供一个代码复用平台。将变与不变区分开,将不变的部分抽取出来定义在父类中,比如算法骨架,一些公共的,固定实现。这些不变的被封闭起来,尽量不去修改他们;通过子类实现可变化的步骤。
结构图:
代码:
//AbstractClass抽象类
class AbstractClass
{
public:
//算法骨架
public void TemplateMethod()
{
。。。
PrimitiveOperation1();
PrimitiveOperation2();
。。。
}
//需要子类实现的抽象行为
virtual void PrimitiveOperation1() ;
virtual void PrimitiveOperation2() ;
}
//ConcreteClass实现子类A,可以有无限制个实现
class ConcreteClassA : AbstractClass
{
//实现具体行为
void PrimitiveOperation1()
{
。。。;
}
void PrimitiveOperation2()
{
。。。;
}
}
//ConcreteClass实现子类B,可以有无限制个实现
class ConcreteClassB : AbstractClass
{
//实现具体行为
void PrimitiveOperation1()
{
。。。;
}
void PrimitiveOperation2()
{
。。。;
}
}
//客户端
AbstractClass cAbstractClass = new ConcreteClassA();//将子类声明为父类,利用多态实现代码复用
cAbstractClass.TemplateMethod();
cAbstractClass = new ConcreteClassB();
cAbstractClass.TemplateMethod();
使用时机:
当完成一个过程,仅有某个更详细的步骤实现不同时,通常考虑使用模板。就是说当不变和可变的行为在实现时混合在一起,导致不变的行为重复出现时,就应该考虑模板模式了。
优点:把不变行为搬到抽象父类中,去除子类中的重复代码;符合单一原则、开放封闭原则。
缺点:每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象