模板方法模式
模板方法模式
定义
模板方法模式是一种只需使用继承就可以实现的非常简单的模式
模板方法模式由两部分组成:
- 抽象父类
- 具体的实现子类
通常在抽象父类中封装了子类的算法结构框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序,子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类方法
假如有一些平行的子类,各个子类之间有一些相同的行为,也有一些不同的行为,如果相同和不同的行为都混合在各个子类的实现中,说明这些相同的行为会在各个子类中重复出现,但实际上,相同的行为可以被迁移到另外一个单一的地方,模板方法模式就是为解决这个问题而出现的,在模板方法模式中,子类实现中的相同部分被上移到父类中,而将不同的部分留在了子类等子类来实现,这也很好的体现了泛化的思想
泛化:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性
用例
coffee or Tea
咖啡与茶是一个经典的例子,去除大多个性化需求
泡一杯咖啡,步骤如下:
- 把水煮沸
- 用沸水冲泡咖啡
- 把咖啡倒进杯子
- 加糖和牛奶
泡一杯茶,步骤如下:
- 把水煮沸
- 用沸水浸泡茶叶
- 把茶水倒进杯子
- 加柠檬
只需要分理出这两个过程的共同点,创建一个抽象父类来表示整个过程,经过抽象之后不管是泡咖啡还是泡茶,都只需要创建子类来代替不同点即可
使用场景
模板方法模式常被架构师用于搭建项目的框架,架构师定好了架构的骨架,程序员继承框架的结构之后,负责往里面填空
钩子方法
通过模板方法模式,在父类中封装了子类的算法框架,这些算法框架在正常状态下是适用于大多数子类的,但如果有一些特别的子类,就可以通过钩子方法(hook)来解决这种问题,放置钩子是隔离变化的常见手段,在父类中容易变化的地方放置钩子,钩子可以有一个默认的实现,究竟要不要“挂钩”,这由子类自己决定,钩子方法的返回结果决定了模板方法后面部分的执行步骤,也就是程序接下来的走向,这样依赖,程序就拥有了变化的可能
总结
模板方法模式是一种典型的通过封装变化提高系统扩展性的设计模式,在传统的面向对象语言中,一个运用了模板方法模式的程序中,子类的方法种类和执行顺序都是不变的,所以把这部分逻辑抽象到父类德模板方法里面,而子类的方法具体怎么实现则是可变的,于是把这部分变化的逻辑封装到子类中,通过增加新的子类,便能给系统增加新的工鞥,并不需要改动抽象父类以及其他子类,这也是符合开放-封闭原则的