template method(模板方法)

一.引入

二.template method(模板方法)

代码示例:

一开始的代码:

template1_app.cpp:

 1 //应用程序开发人员
 2 class Application{
 3 public:
 4     bool Step2(){
 5         //...
 6     }
 7
 8     void Step4(){
 9         //...
10     }
11 };
12
13 int main()
14 {
15     Library lib;  //这里都是以类的方式来调用方法的
16     Application app;
17
18     lib.Step1();
19
20     if (app.Step2()){
21         lib.Step3();
22     }
23
24     for (int i = 0; i < 4; i++){
25         app.Step4();
26     }
27
28     lib.Step5();
29
30 }

对应的库的代码:

template1_lib.cpp:

 1 //程序库开发人员
 2 class Library{
 3
 4 public:
 5     void Step1(){
 6         //...
 7     }
 8
 9     void Step3(){
10         //...
11     }
12
13     void Step5(){
14         //...
15     }
16 };

这里的主体程序流程,实际上框架开发者已经设计好了,常常是稳定的.

因此更好的解决方案是,库开发者把流程写好,一些需要开发者实现的接口定义好,留给开发者实现:

改进后的代码:

template2_lib.cpp:

 1 //程序库开发人员
 2 class Library{
 3 public:
 4     //稳定 template method
 5     void Run(){
 6
 7         Step1();
 8
 9         if (Step2()) { //支持变化 ==> 虚函数的多态调用
10             Step3();
11         }
12
13         for (int i = 0; i < 4; i++){
14             Step4(); //支持变化 ==> 虚函数的多态调用
15         }
16
17         Step5();
18
19     }
20     virtual ~Library(){ }
21
22 protected:  //采用protected,让子类能够访问到.
23
24     void Step1() { //稳定
25         //.....
26     }
27     void Step3() {//稳定
28         //.....
29     }
30     void Step5() { //稳定
31         //.....
32     }
33
34     virtual bool Step2() = 0;//变化
35     virtual void Step4() =0; //变化
36 };

template2_app.cpp:

 1 //应用程序开发人员
 2 class Application : public Library {
 3 protected:
 4     virtual bool Step2(){
 5         //... 子类重写实现
 6     }
 7
 8     virtual void Step4() {
 9         //... 子类重写实现
10     }
11 };
12
13
14
15
16 int main()
17     {
18         Library* pLib=new Application();
19         lib->Run();
20
21         delete pLib;
22     }
23 }

注意一下:

基类的析构函数要写成虚的,否则调用不到子类的析构函数,因为如果不是虚函数的话,

基类指针只能找到基类的析构函数,delete时只会调用基类的析构函数;而析构函数为虚函数时,则基类指针可以找到子类对应的析构函数.

红色部分时稳定的,蓝色部分是变化的.

原文地址:https://www.cnblogs.com/Stephen-Qin/p/11619975.html

时间: 2024-10-03 10:55:53

template method(模板方法)的相关文章

设计模式 ( 二十 ): Template method模板方法模式 -- 行为型

  1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ? 3.

设计模式13:Template Method 模板方法模式(行为型模式)

Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特定的设计方法来应对这种变化. 动机(Motivation) 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固定的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现. 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期

Template Method (模板方法模式)

要想实现 模板方法模式,涉及到两个角色:1.抽象模板角色---父类(抽象的) 2.具体模板角色---子类 就是父类和子类继承的表现 抽象模板角色这个类里 定义了几个抽象方法,供子类去实现具体操作,还定义了一个模板方法(template),以告诉子类去实现这些方法要有一定的顺序去执行, 这种设计模式在JUnit中的setUp(),runTest(),tearDown()体现了, 源码: public void runBare() throws Throwable { setUp(); try {

设计模式(八)the Template method 模板方法模式(类行为型)

1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关. 例子1:银行业务办理流程 在银行办理业务时,一般都包含几个基本固定步骤: 取号排队->办理具体业务->对银行工作人员进行评分. 取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ?

封装算法: 模板方法(Template Method)模式

template method(模板方法)模式是一种行为型设计模式.它在一个方法中定义了算法的骨架(这种方法被称为template method.模板方法),并将算法的详细步骤放到子类中去实现.template method使得子类能够不改变一个算法的结构就可以重定义该算法的某些特定步骤. 须要指出的是,这里所说的template并非c++中的模板. 适用性 算法的骨架事先已确定,仅仅是算法的某些步骤的详细实如今不同的子类中有所不同 优点 算法的基本骨架已确定,子类能够方便地实现算法的变体 避免

设计模式的征途—17.模板方法(Template Method)模式

在现实生活中,很多事情都需要经过几个步骤才能完成,例如请客吃饭,无论吃什么,一般都包含:点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单=>吃东西=>买单.在这3个步骤中,点单和买单大同小异,最大的区别在于第2步-吃什么?吃面条和吃满汉全席可大不相同. 在软件开发中,有时候也会遇到类似的情况,某个方法的实现需要多个步骤(类似于“请客”),其中有些步骤是固定的,而有些步骤则存在可变性.为了提高代码复用性和系统灵活性,可以使用一种称之为模板方法模式的设计模式来对这类情况进行设计.

java设计模式 模板方法模式Template Method

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因.

行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式

1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子类通过继承这个抽象基类去实现各个步聚的抽象方法,而工作流程却由父类来控制. 2 模板方法应用于下列情况: 1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现. 2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复.首先识别现有代码中的不同之处,并且将不同之处分离为新

设计模式之模板方法模式(Template Method)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以