设计模式实现(七)--- 模板方法模式(Template Method)
2014-07-29 16:41
603 查看
概述:
如果继承有意义,就应该要称为子类的模板,所有重复的代码都应该上升到父类中区,而不是让每个子类都一一重复。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可定重定义该算法的某些特定步骤。
模板方法的特点:
模板方法模式是通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。
当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
模板方法模式原型实现
模板方法模式例子
如果继承有意义,就应该要称为子类的模板,所有重复的代码都应该上升到父类中区,而不是让每个子类都一一重复。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可定重定义该算法的某些特定步骤。
模板方法的特点:
模板方法模式是通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。
当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
模板方法模式原型实现
#include <stdio.h> /* AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法, 它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。 */ class AbstractClass { public: //一些抽象方法,放到子类中去实现 virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; public: //模板方法 void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); } }; /* ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass 都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。 */ class ConcreteClassA : public AbstractClass { public: void PrimitiveOperation1() { printf("具体类A方法实现1\n"); } void PrimitiveOperation2() { printf("具体类A方法实现2\n"); } }; class ConcreteClassB : public AbstractClass { public: void PrimitiveOperation1() { printf("具体类B方法实现1\n"); } void PrimitiveOperation2() { printf("具体类B方法实现2\n"); } }; 客户端 int main() { AbstractClass *c; c = new ConcreteClassA(); c->TemplateMethod(); c = new ConcreteClassB(); c->TemplateMethod(); return 1; }
模板方法模式例子
#include <stdio.h> //一个抄题,答题程序 //AbstractClass class Test { public: virtual char answer1() = 0; virtual char answer2() = 0; public: virtual void TestQuestion1() { printf("第一题:1 + 3 = 【】 \n a.4 b.5 c.6 d.7 \n "); printf("答案:%c\n",answer1()); } virtual void TestQuestion2() { printf("第二题:1 * 3 = 【】 \n a.3 b.5 c.6 d.7 \n "); printf("答案:%c\n",answer2()); } }; //ConcreteClass class TestPaperA : public Test { public: char answer1() { return 'a'; } char answer2() { return 'a'; } }; class TestPaperB : public Test { public: char answer1() { return 'b'; } char answer2() { return 'c'; } }; //客户端 int main() { Test *base; base = new TestPaperA(); //此处用父类指针 base->TestQuestion1(); base->TestQuestion2(); base = new TestPaperB(); //此处用父类指针 base->TestQuestion1(); base->TestQuestion2(); return 1; }
相关文章推荐
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 模板方法模式(Template Method) - Java实现
- First head 设计模式学习c++实现------模板方法模式(Template method pattern)
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- 设计模式----Template Method(模板方法)
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
- Java设计模式—模板方法(Template Method)
- 设计模式之模板方法模式(Template Method)
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 设计模式(七)[模板方法(Template Method)模式]
- 设计模式C++实现(5)——原型模式、模板方法模式
- (Template Method)模板方法模式的Java实现 推荐
- 设计模式学习笔记(二十四)——Template Method模板方法
- 设计模式学习-Template Method(模板方法)
- 23种设计模式之模板方法(Template Method)
- 设计模式----Template Method(模板方法)
- 设计模式学习笔记(十六)——Template Method模板方法模式
- 设计模式学习笔记(十六)——Template Method模板方法模式
- 《模式——工程化实现及扩展》(设计模式C# 版)《模板方法模式 Template》——“自我检验" 参考答案