神刀安全网

设计模式之“组件协作模式”: 模板方法Template Method

GOF-23 模式分类


“目的”角度
  • 创建型(Creational)模式
    对象的部分创建工作延迟到子类或其他对象,从而应对需求变化给对象创建时具体类型实现引来的冲击
  • 结构型(Structural)模式
    通过类继承或者对象组合获得更灵活的结构,从而应对需求变化给对象的结构带来的冲击
  • 行为型(Behavioral)模式
    通过类继承对象组合来划分类与对象间的职责,从而应对需求变化给多个交互的对象带来的冲击
“范围”角度
  • 类模式处理 类与子类静态关系 (类关系是静态的,写好的代码结构决定)
  • 对象模式处理对象间的动态关系(对象关系是动态的,运行时具体情况而定)

设计模式之“组件协作模式”: 模板方法Template Method

从“封装变化”角度进行模式分类

找稳定点和变化点的角度去理解运用设计模式

设计模式之“组件协作模式”: 模板方法Template Method


重构获得模式 Refactoring to Patterns

  1. 面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指的是可以满足“应对变化,提高复用”的设计
  2. 现代软件设计的特征是“需求频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而提高对需求变化的应对能力”。“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。
  3. 设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好的使用设计模式的方法。

推荐书籍 — 重构

设计模式之“组件协作模式”: 模板方法Template Method
重构中找到设计模式的最佳用法

重构的关键技法

  1. 静态 —> 动态
  2. 早绑定 —> 晚绑定
  3. 继承 —> 组合
  4. 编译时依赖 —> 运行时依赖
  5. 紧耦合 —> 松耦合

一、 “组件协作”模式

  • 大型软件开发一般将“框架 — 应用程序”划分开来。“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    1. Template Method (模板方法 模式)
    2. Strategy (策略 模式)
    3. Observer / Event (观察者/事件 模式)

本篇笔记就讲述“Template Method (模板方法 模式)”

Template Method 模板方法 模式

设计模式之“组件协作模式”: 模板方法Template Method

模式定义

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

组成:

  1. 父类 + 算法(流程) + 抽象函数
  2. 子类 + 实现抽象函数 + 调用父类算法
模式结构(Structure)

类图表示

设计模式之“组件协作模式”: 模板方法Template Method

动机 Motivation(针对的问题是什么)
  • 问题:软件构建过程,对某一任务,有稳定不变的整体操作结构、流程,但有个别子步骤会根据需求改动,又或者其他固有原因(如框架和应用间的关系)无法和任务整体结构同时实现(类似于点击事件的实现)
  • 要得到的结果:在确定稳定操作结构的前提下,灵活应对各个子步骤的变化或者晚期实现需求。

要怎么实现上述诉求呢?
把稳定的结构抽取出来,放到Library(框架)里面,把不稳定的子步骤(方法的实现)配置为抽象的(当应用程序使用到该库的时候需要实现的),留给应用开发者去实现。
类似于Android中的点击函数,如何获取点击事件并响应,这个操作流程肯定是稳定的,不需要我们操心,但是具体如何响应则是不稳定的,不同app的按钮对应的意义操作不一,辣么就把响应方法设置为抽象的,让我们去重写实现即可。框架就可以在稳定的按钮点击事件流程中,适应不同的需求。
这就是把原有的结构化的程序设计,通过面向对象的程序设计进行改造,以得到更好的应对变化的特性。
程序开发人员也可以减少代码量,因为稳定的结构已经被封装在库里面,我们只需要完成这个结构中不稳地的部分(实现其抽象方法)。

设计模式之“组件协作模式”: 模板方法Template Method
结构化设计流程

设计模式之“组件协作模式”: 模板方法Template Method
面向对象软件设计流程

设计模式之“组件协作模式”: 模板方法Template Method
早绑定与晚绑定

早绑定:晚的类调用早的类(把早的类绑定到晚的类当中)
晚绑定:早的类调用晚的类(把晚的类绑定到早的类当中)
实现机制虚函数的多态调用。因为函数是抽象的,会在晚的类中被实现(因为子类必须要实现父类的抽象方法),早的类中就会调用晚的类中的实现。

设计模式之“组件协作模式”: 模板方法Template Method
虚函数的多态调用


总结要点

  1. Template Method模式是常见的基础性的设计模式,一般的面向对象程序都会大量的应用它。使用最简洁的机制(虚函数多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  2. 反向控制结构是Template Method的典型应用:“你别调用我,帮我实现那个方法就好,我来调用你,因为对整个流程你懂个屁”
  3. 在具体实现(运用)时,被Template Method调用的虚方法可以距有实现的,也可以是没有任何实现(抽象方法、纯虚方法),但一般推荐设置为protected方法(只有子类可以调用、重写)。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 设计模式之“组件协作模式”: 模板方法Template Method

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址