TOP

Android设计模式2之Template Method

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

本节设计目标 Template Method

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

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

方案一

结构化设计思维

早绑定 Library<—-Application

步骤

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

源码:

  1. //程序库开发人员
  2. classLibrary{
  3. //稳定
  4. publicvoid step1(){//...
  5. }
  6. //稳定
  7. publicvoid step3(){//...
  8. }
  9. //稳定
  10. publicvoid step5(){//...
  11. }
  12. }
  1. //应用程序开发人员
  2. classApplication{
  3. //变化
  4. publicboolean step2(){//...
  5. returntrue;
  6. }
  7. //变化
  8. publicvoid step4(){//...
  9. }
  10. //稳定
  11. publicstaticvoid main(String args[]){
  12. Library lib =newLibrary();
  13. Application app =newApplication();
  14. lib.step1();
  15. if(app.step2()){
  16. lib.step3();
  17. }
  18. for(int i =0; i <4; i++){
  19. app.step4();
  20. }
  21. lib.step5();
  22. }
  23. }

方案二

面向对象设计思维  ————复用性得到提升

晚绑定 Library—->Application

步骤

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

源码:

  1. //程序库开发人员
  2. abstractclassLibrary{
  3. publicvoid run(){//稳定 template method
  4. step1();
  5. if(step2()){//支持变化 ==> 虚函数的多态调用
  6. step3();
  7. }
  8. for(int i =0; i <4; i++){
  9. step4();//支持变化 ==> 虚函数的多态调用
  10. }
  11. step5();
  12. }
  13. protectedvoid step1(){//稳定 //...
  14. }
  15. protectedvoid step3(){//稳定 //...
  16. }
  17. protectedvoid step5(){//稳定 //...
  18. }
  19. abstractboolean step2();//变化
  20. abstractvoid step4();//变化
  21. }
  1. //应用程序开发人员
  2. classApplicationextendsLibrary{
  3. @Override
  4. protectedboolean step2(){//... 子类重写实现
  5. returntrue;
  6. }
  7. @Override
  8. protectedvoid step4(){//... 子类重写实现
  9. }
  10. publicstaticvoid main(String args[]){
  11. Library lib =newApplication();
  12. lib.Run();
  13. }
  14. }

总结

  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用,它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,不要强调自我,让我来调用你的反向控制结构是Template Method的典型应用。
  • 在具体的实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐设置为Protected方法。





posted @ 2016-08-26 14:37  星空守候  阅读(235)  评论(0编辑  收藏  举报