Android设计模式2之Template Method

Android设计模式2  Template Method

GOF-23 模式分类

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

 

从封装变化角度对模式分类
组件协作对象性能数据结构
Template MethodSingletonComposite
StrategyFlyweightLterator
Observer/EventChain of Resposibility
单一职责行为变化状态变化
DecoratorCommandState
BridgeVisitorMemento
接口隔离对象创建领域问题
FacadeFactory MethodInterpreter
ProxyAbstract Factory
AdapterPrototype
MediatorBuilder

 

重构获得模式 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以及程序主流程

源码:

//程序库开发人员
class Library {
    //稳定
    public void step1() { //...
    }
    //稳定
    public void step3() { //...
    }
    //稳定
    public void step5() {//...
    }
}
//应用程序开发人员
class Application {
    //变化
    public boolean step2() {//...
        return true;
    }
    //变化
    public void step4() {//...
    }
    //稳定
    public static void main(String args[]) {
        Library lib = new Library();
        Application app = new Application();
        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

源码:

//程序库开发人员
abstract class Library {
    public void run() {//稳定 template method
        step1();
        if (step2()) {//支持变化 ==> 虚函数的多态调用
            step3();
        }
        for (int i = 0; i < 4; i++) {
            step4();//支持变化 ==> 虚函数的多态调用
        }
        step5();
    }
    protected void step1() {//稳定  //...
    }
    protected void step3() {//稳定 //...
    }
    protected void step5() {//稳定 //...
    }
    abstract boolean step2();//变化
    abstract void step4();//变化
}
//应用程序开发人员
class Application extends Library {
    @Override
    protected boolean step2() {//... 子类重写实现
        return true;
    }
    @Override
    protected void step4() { //... 子类重写实现
    }
    public static void main(String args[]) {
        Library lib = new Application();
        lib.Run();
    }
}
总结
  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用,它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,不要强调自我,让我来调用你的反向控制结构是Template Method的典型应用。
  • 在具体的实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐设置为Protected方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值