算是读书笔记吧
极客时间--设计模式之美
什么是模板模式
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。
举个现实中的例子,在一个埋点上报的系统中:
- 基类实现通用的主体功能算法:
比如新增、格式化、存储、切割等。 - 子类重写特殊的局部算法:
比如上报(TCP/HTTP)方式、存储的数据库路径等。
模板方法中通过调用抽象方法,达到定制的目的:
简单的流程如下
插入 -- 父类实现
格式化 -- 父类实现
存储 -- 父类实现
到达轮训时间 -- 父类实现
调用上报方法 -- 《《子类实现》》
上报完成删除本地数据 -- 父类实现
模板模式的作用
- 复用
基类
的作用是通过继承复用
模板方法(主体逻辑) - 扩展
子类
的作用是通过重写扩展
抽象方法(特定功能)
模板模式在使用上,更倾向于指导如何实现一个高度复用流程中的局部扩展。
经典的模板模式
- 模板方法不允许子类重写
模板方法定义为final
,可以避免被子类重写。 - 抽象方法要求子类必须实现
需要子类重写的方法定义为abstract
,可以强迫子类去实现。
这两点主要通过编译器检查进行约束
不过,在实际项目开发中,模板模式的实现比较灵活,以上两点都不是必须的
Callback
通过Callback也可以实现可复用流程的局部定制
其本质思想,与模板模式相同,都是在通用流程中调用定制方法。
只不过从调用抽象方法
,变成了调用某个Callback
插入 -- 父类实现
格式化 -- 父类实现
存储 -- 父类实现
到达轮训时间 -- 父类实现
调用上报Callback -- 《《外部传入》》
上报完成删除本地数据 -- 父类实现
但是在具体实现技术上,二者是不同的,主要体现在
模板模式的扩展性基于
继承
,而Callback的扩展性基于组合
面向对象的有一个思想是组合优于继承,在这里体现在:
- Callback可以很好的实现多继承
- 用函数代替创建子类,更加轻量
-
不必为了一个小需求,实现全部的抽象方法
由于编译器的限制,abstract
声明的抽象方法必须全部实现。
而Callback则规避了这个问题,只需要实现当前需求所需的几个抽象方法(callback)即可。
当然,灵活的代价就是牺牲一定的可读性,比如单一职责原则。