Android设计模式2  Template Method

GOF-23 模式分类

目的

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

 

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

组件协作

 

对象性能

 

数据结构

 

 

Template Method

 

Singleton

 

Composite

 

Strategy

 

Flyweight

 

Lterator

 

Observer/Event

 

 

 

Chain of Resposibility

单一职责

 

行为变化

 

状态变化

 

 

Decorator

 

Command

 

State

 

Bridge

 

Visitor

 

Memento

接口隔离

 

对象创建

 

领域问题

 

 

Facade

 

Factory Method

 

Interpreter

 

Proxy

 

Abstract Factory

 

 

 

Adapter

 

Prototype

 

 

 

Mediator

 

Builder

 

 

 

重构获得模式 Refactoring to Patterns
  • 面向对象设计模式是

好的面向对象设计

  • ,所谓

好的面向对象设计

  • 指的是那些可以满足

应对变化,提高复用

  • 的设计。
  • 现代软件设计的特征是

需求的频繁变化

  • ,设计模式的要点是

寻求变化点,然后在变化点处应用设计模式,从而来更好地应对需求的变化

  • .

什么时候,什么地点应用设计模式

理解设计模式结构本身

  • 更为重要。
  • 设计模式的应用不宜先入为主,没有一步到位的设计模式,敏捷软件开发实践提倡的

Refactoring to Patterns

  • 是目前公认的最好的使用设计模式的方法。

 

重构关键技法
  • 静态->动态
  • 早绑定->晚绑定
  • 继承->组合
  • 编译时依赖->运行时依赖
  • 紧耦合->松耦合

 

“组件协作”模式

  • 现代软件专业分工之后的第一个结果是:“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    Template Method
    Strategy
    Observer/Event

本节设计目标

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

  • 程序库开发人员要设计一个Library,他要实现其中的3个步骤:step1,step3,step5(稳定)(被复用)
  • 应用程序开发人员需要做另外的2个步骤:step2,step4(变化),并且要把这5个步骤按照某种流程(稳定)、算法打包在一起。

方案一

结构化设计思维
早绑定 Library<—-Application

步骤

  • 程序库开发人员开发step1,step3,step5
  • 应用程序开发人员开发step2,step4以及程序主流程

源码:

//程序库开发人员classLibrary{//稳定publicvoid step1(){//...}//稳定publicvoid step3(){//...}//稳定publicvoid step5(){//...}}//应用程序开发人员classApplication{//变化publicboolean step2(){//...returntrue;}//变化publicvoid step4(){//...}//稳定publicstaticvoid main(String args[]){Library lib =newLibrary();Application app =newApplication(); lib.step1();if(app.step2()){ lib.step3();}for(int i =0; i <4; i++){ app.step4();} lib.step5();}}

方案二

面向对象设计思维  ————复用性得到提升
晚绑定 Library—->Application

步骤

  • 程序库开发人员开发step1,step3,step5以及程序主流程
  • 应用程序开发人员开发step2,step4

源码:

//程序库开发人员abstractclassLibrary{publicvoid run(){//稳定 template method step1();if(step2()){//支持变化 ==> 虚函数的多态调用 step3();}for(int i =0; i <4; i++){ step4();//支持变化 ==> 虚函数的多态调用} step5();}protectedvoid step1(){//稳定 //...}protectedvoid step3(){//稳定 //...}protectedvoid step5(){//稳定 //...}abstractboolean step2();//变化abstractvoid step4();//变化}//应用程序开发人员classApplicationextendsLibrary{@Overrideprotectedboolean step2(){//... 子类重写实现returntrue;}@Overrideprotectedvoid step4(){//... 子类重写实现}publicstaticvoid main(String args[]){Library lib =newApplication(); lib.Run();}}

总结
  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用,它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,

不要强调自我,让我来调用你

  • 的反向控制结构是Template Method的典型应用。
  • 在具体的实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐设置为Protected方法。