设计模式---模板模式(C++实现)

来源:互联网 发布:java 字符串连接 编辑:程序博客网 时间:2024/06/14 15:27

       在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。


意图

       定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


解决问题

       一些方法通用,却在每一个子类都重新写了这一方法。


如何解决

将这些通用算法抽象出来。


优点

1. 封装不变部分,扩展可变部分

2. 提取公共代码,便于维护

3. 行为由父类控制,子类实现


缺点

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使系统变得庞大。


使用场景

1. 有多个子类共有方法,且逻辑相同

2. 重要的、复杂的方法可以考虑作为模板方法


注意事项

为防止恶意操作,一般模板方法都加上final 关键词


UML类图


AbstractClass(抽象类):定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤。主要是实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。

ConcreteClass(具体类):实现原语操作以完成算法中与特定子类相关的步骤。
由于在具体的子类ConcreteClass中重定义了实现一个算法的各步骤,而对于不变的算法流程则在AbstractClass的TemplateMethod中完成。



C++实现(由于此方法很简单,没什么说的了,那就简单实现以下吧。) 


//模板模式class AbstractClass{public :void TemplateMethod(){Operation1();cout << "TemplateMethod " << endl;Operation2();}protected:virtual void Operation1(){cout << "Default  Operation1"<< endl;}virtual void  Operation2(){cout << "Default Operation2"<< endl;}};class ConcreteClassA : public AbstractClass{protected:virtual void Operation1(){cout << "ConcreteA Operation1"<< endl;}virtual void Operation2(){cout << "ConcreteA Operation2"<< endl;}};class ConcreteClassB : public AbstractClass{protected:virtual void Operation1(){cout <<"ConcreteB Operation1" << endl;}virtual void Operation2(){cout <<"ConcreteB Operation" << endl;}};


客户端


int test_Template()  //模板模式{AbstractClass * pAc = new ConcreteClassA;pAc->TemplateMethod();AbstractClass* pBc = new ConcreteClassB;pBc->TemplateMethod();if (pAc)delete pAc;if (pBc) delete pBc;system("pause");return 0;}



0 0
原创粉丝点击