模板方法模板定义
模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
模板方法模式的使用场景
算法或操作遵循相似的逻辑
重构时(把相同的代码抽取到父类中)
重要、复杂的算法,核心算法设计为模板算法
模板方法的例子
我们去银行取钱的时候通常会有以下流程:
- 取号
- 填写单据
- 等待叫号
- 窗口办理
每个人都是通过这个模板(流程)进行办理业务,接下来用代码来实践一下。
类图
代码实现
银行的模板方法
1 | package com.doity.templatemethod; |
具体的子类,取钱
1 | package com.doity.templatemethod; |
具体的子类,开户
1 | package com.doity.templatemethod; |
测试类
1 | package com.doity.templatemethod; |
测试结果
1 | 在银行门口取号 |
以上是最简单虚拟的场景,假设有不需要填表的业务:存钱。
钩子函数使子类选择挂载
修改一下Bank的类
1 | // 2、填写单据 |
1 | /* |
测试类结果
1 | System.out.println("----------分割线2-------------"); |
使用钩子函数的测试结果
1 | 在银行门口取号 |
结论
方法模板的总结
准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予更大的灵活性。最后将方法汇总成一个不可以改变的模板方法。
模板方法模板的优点
- 封装性好
- 复用性好
- 屏蔽细节
- 便于维护
模板方法模式的缺点
Java 是一种单继承的语言。也就是一个类,只能继承一个类。
我们设想在一个系统当中大量的使用了继承,如果我们需要重构,通过模板方法的模式来抽取共性,以及增加算法或者叫做增加架构的弹性的时候,因为我们的类已经处于了继承层次某个结构之中,再通过模板方法引入新的继承的时候,也许会遇到困难。
参考资料
- 模式的秘密—模板方法模式 http://www.imooc.com/learn/145
- 模板方法模式 - 维基百科 https://zh.wikipedia.org/模板方法模式