本系列所有文章来自李建忠老师的设计模式笔记,系列如下:
设计模式(一)面向对象设计原则
23种设计模式(二)组件协作之模板方法
23种设计模式(三)组件协作之策略模式
23种设计模式(四)组件协作之观察者模式
23种设计模式(五)单一职责之装饰模式
23种设计模式(六)单一职责之桥模式
23种设计模式(七)对象创建之工厂方法
23种设计模式(八)对象创建之抽象工厂
23种设计模式(九)对象创建之原型模式
23种设计模式(十)对象创建之构建器
23种设计模式(十一)对象性能之单件模式
23种设计模式(十二)对象性能之享元模式
23种设计模式(十三)接口隔离之门面模式
23种设计模式(十四)接口隔离之代理模式
23种设计模式(十五)接口隔离之适配器
23种设计模式(十六)接口隔离之中介者
23种设计模式(十七)状态变化之状态模式
23种设计模式(十八)状态变化之备忘录
23种设计模式(十九)数据结构之组合模式
23种设计模式(二十)数据结构之迭代器
23种设计模式(二十一)数据结构之职责链
23种设计模式(二十二)行为变化之命令模式
23种设计模式(二十三)行为变化之访问器
23种设计模式(二十四)领域规则之解析器

文章目录

  • Template Method 模式
  • 设计方法一
  • 设计方法二
  • 两种方法对比
  • 模式定义

  23种设计模式主要可以分为以下几类:

  • 从目的来看

创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。

结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。

行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。

  • 从范围来看

  类模式处理类与子类的静态关系。
  对象模式处理对象间的动态关系。

  • 从封装变化角度对模式分类

  面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指是那些可以满足“应对变化,提高复用”的设计

  现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而来更好地应对需求的变化”.“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。

  不光是写代码,看代码也需要看到代码的变化部分,与不变部分。

  设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring to Patterns”(重构设计模式)是目前普遍公认的最好的使用设计模式的方法。

Template Method 模式

  在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

设计方法一

  先举个例子看一下:

  • template1_lib.cpp
//程序库开发人员
class Library{public:void Step1(){//...}void Step3(){//...}void Step5(){//...}
};
  • template1_app.cpp
//应用程序开发人员
class Application{public:bool Step2(){//...}void Step4(){//...}
};int main()
{Library lib();Application app();lib.Step1();if (app.Step2()){lib.Step3();}for (int i = 0; i < 4; i++){app.Step4();}lib.Step5();}

  上述的main函数执行的流程常常是不需要更改且是稳定的。

  上面是一种做法,接下来看一下第二种做法:

设计方法二

  • template2_lib.cpp
//程序库开发人员
class Library{public://稳定 template methodvoid Run(){Step1();if (Step2()) { //支持变化 ==> 虚函数的多态调用Step3(); }for (int i = 0; i < 4; i++){Step4(); //支持变化 ==> 虚函数的多态调用}Step5();}virtual ~Library(){ }protected:void Step1() { //稳定//.....}void Step3() {//稳定//.....}void Step5() { //稳定//.....}virtual bool Step2() = 0;//变化virtual void Step4() =0; //变化
};

  这里的框架开发人员完全可以把这个主函数的流程给写下来。

  • template2_app.cpp
//应用程序开发人员
class Application : public Library {protected:virtual bool Step2(){//... 子类重写实现}virtual void Step4() {//... 子类重写实现}
};int main(){Library* pLib=new Application();lib->Run();delete pLib;}
}

  Library* pLib=new Application();是一个多态指针,他的声明类型是一个Library, 但是实际类型是Application,当它调用虚函数的时候就会按照虚函数的动态绑定规则去调用。

  在c++里面写一个基类的话,有一条原则就是应该把这个基类里面的析构函数写成虚的。如果不写成虚的,那么Library* pLib=new Application();这行代码就调用不到子类的析构函数。

两种方法对比

  第一种方法是结构化的软件设计流程

  • 结构化软件设计流程

  • 面向对象软件设计流程

  这两种设计方法主要的不同之处在于早绑定与晚绑定:

  Library一般写地早,Application写地比较晚,当一个写地比较晚的东西调用一个写地比较早的东西,这就是早绑定。这是所有编程语言都比较默认的做法。在面向对象编程里面有一种叫做晚绑定的机制,Library调用Application, 一个早的东西调用一个晚的东西,这就叫做晚绑定。

模式定义

  定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。

  通俗一点来说就是定义一个虚函数,让子类去实现这个虚函数。延迟到子类也就是支持子类变化。

23种设计模式(二)组件协作之模板方法相关推荐

  1. 23种设计模式(十四)模板方法模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  2. 李建忠讲23种设计模式笔记-上

    前两天在B站看了李建忠老师讲23种设计模式的系列视频,收获颇丰.设计模式是前人的智慧和经验的总结,需要我们反复地学习.在实践中体会其蕴含的设计原则和设计思想.李老师按照封装变化将23种设计模式分成组件 ...

  3. 设计模式(二)23种设计模式

    设计模式(二)23种设计模式 文章目录 设计模式(二)23种设计模式 组件协作模式 策略模式 观察者模式 单一职责模式 Decorator模式 Bridge模式 对象创建模式 Factory Meth ...

  4. 23种设计模式 UML 类图及对应示例代码 (二)

    23种设计模式 UML 类图及对应示例代码 (二) 11.DoFactory.GangOfFour.Flyweight.Structural Flyweight:运用共享技术有效的支持大量细粒度的对象 ...

  5. 23种设计模式-个人笔记(二)

    目录 五.23 种设计模式 1.单例模式 1.1.单例模式的定义与特点 1.2.单例模式的优点和缺点 1.3.单例模式的应用场景 1.4.单例模式的结构与实现 1.5.八种方式详解 1.6.单例模式在 ...

  6. 23种设计模式之 : 模板方法设计模式

    23种设计模式之 : 模板方法设计模式 每博一文案 青年,青年!无论受怎样的挫折和打击,都要咬着牙关挺住,因为你们完全有机会重建生活:只要不灰心丧气,每一次挫折就只不过是通往新境界的一块普通绊脚石,而 ...

  7. 23种设计模式----模板方法模式----行为模式

    模板方法模式 1.模板方法模式是什么 2.模板方法的组成 3.模板方法中不同的类的行为 4.例子 4.1 例子的背景 4.2模板类--父亲寻找继承人的方式 4.3实现类----孩子类 4.4测试类-- ...

  8. 23种设计模式之模板方法

    23种设计模式总篇:chenmingyu.top/design/ 模板方法 模板方法属于行为型模式 定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定 ...

  9. 23种设计模式(二十三)访问者模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  10. 23种设计模式(二十二)状态模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

最新文章

  1. python之数据库连接
  2. Codeforces 494D Birthday 树形dp (看题解)
  3. 基于物联网的新型智能家居控制系统设计
  4. 记录——《C Primer Plus (第五版)》第十章编程练习第十一题
  5. 生产者消费者伪码_[线程同步]生产者消费者代码实现
  6. html圈小猫小游戏
  7. 【基础知识】【模块介绍】电机编码器
  8. 如何关闭 Mac 版 QQ 上线离线提示音?
  9. labwindows mysql_LabWindows/CVI(二):基本代码框架函数说明
  10. sniffer 嗅探器
  11. xctf攻防世界 MISC高手进阶区 flag_universe
  12. party_bid_core总结
  13. 一些服务器常见漏洞的修复方法
  14. MAF 项目创建流程
  15. 7-2 sdust-Java-学生成绩读取与排序 (8 分)
  16. Notepad++常用插件下载地址
  17. mysql里all什么意思_mysql中all的用法是什么
  18. 离散数学数理逻辑部分【1】
  19. Java二维数组及面向对象介绍--------08
  20. 【skLearn 回归模型】多项式回归 PolynomialFeatures

热门文章

  1. Linux企业级项目实践之网络爬虫(27)——多路IO复用
  2. C++ Programming with TDD之一:GMOCK框架简介
  3. my makefile 自动推导
  4. 游戏筑基开发之回调函数(C语言)
  5. Ansible详解(二)——Ansible安装与命令
  6. 指定 年-月-日 将其封装tree树状结构
  7. 【速转身边开公司的朋友】连加油站都被比特币勒索病毒黑了!还没关闭服务器445端口的抓紧!...
  8. 一位华为底层老员工的中年危机,发人深思!
  9. Netflix OSS、Spring Cloud还是Kubernetes? 都要吧!
  10. POJ2752 (Seek the Name, Seek the Fame,kmp)