参考资料:
https://www.jianshu.com/p/a3474f4fee57
https://www.imooc.com/video/2555
目录
1、什么是模板方法模式?
2、模板方法模式的主要作用
3、模板方法模式解决的问题
4、如何实现模板方法模式?
5、模板方法模式的特点?
6、理解并使用钩子函数?
7、模板方法模式的实现要素?
8、模板方法模式的优点?
9、模板方法模式的缺点
10、模板方法模式的案例场景
1、什么是模板方法模式?
模板方法模式定义了一个操作中的算法框架,而将一些步骤延迟到子类中实现,使得子类在不可以改变算法结构的同时,就重新定义算法的某些他特定步骤;
2、模板方法模式的主要作用
在不改变模板结构的前提下在子类中重新定义模板中的内容。
3、模板方法模式解决的问题
(1)提高代码复用性
将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
(2)实现了反向控制
通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
4、如何实现模板方法模式?
(1)算法或操作遵循相似的逻辑;
(2)重构时(把相同的代码抽取到父类中);
(3)重要、复杂的算法,核心算法设计为模板算法;
注:无论重构还是新建,只要算法和操作具有相似的逻辑,就可以大胆的去使用模板防范模式
在日常工作大量的情况是遇到历史遗留的系统,由于新功能的加入我们需要变更一些代码或将一些已有代码抽象提取到一个更高层的类中,以更好的实现代码的复用,此时新需求和已有代码片段或业务逻辑有相同、共通的地方时,我们可以把其中的共性抽取成一个模板方法,而将个性交由不通的子类各自实现,从而完成我们的业务需求,这就是重构的时候我们使用模板方法的一个典型场景。
5、模板方法模式的特点?
抽象基类:
(1)提供基本的实现方法,对于各种不同实现子类而言是相同的,具有共性,可以直接在抽象基类中定义其方法(private);
(2)抽象方法:只知道具体原则,而不知道实现细节,需要将他延迟到子类实现的一些步骤;
(3)可选的Hook,钩子函数只在基类中提供默认或空的实现,以供给子类决定是否挂载及如何挂载,从而影响算法实现的一些方法;
(4)Template方法(final):将基本方法、抽象方法、钩子方法按照业务逻辑的需求汇总而成一个模板方法,这就构成了算法框架,需注意的是模板方法一定要声明为final,使得他不能被子类所复写,
模板方法模式支持一个原则:子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构——》好莱坞原则
6、理解并使用钩子函数?
Hook,钩子函数,提供一个默认或空的实现,具体的子类可以自行决定是否挂钩以及如何挂钩
7、模板方法模式的实现要素?
准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。
8、模板方法模式的优点?
(1)封装性好:模板算法就是封装了一个算法的框架,将算法的具体步骤封装成一个通用的模板方法;
(2)复用性好:由于进行了封装,通过抽取共性的方式将大部分的代码在父类中实现,而将那些个性化的逻辑交由子类实现,这样整个父类可以适应非常广泛的业务需求,提高了复用性;
(3)屏蔽细节:由于把很多共性作为一种私有的方式在抽象基类中实现 ,这样对子类屏蔽了很多细节,开始只需要专注与特定算法步骤的一些逻辑,可以把更好的把有限的精力用于重要的业务逻辑的实现;
(4)便于维护:好的复用性可以减少代码框架设计,可以更加弹性的涵盖后期需求变更导致的新需求的代码开发,屏蔽细节,在维护已有系统——》减少代码开发量,从而提高效率;
(5)实现了反向控制:通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
(6)提高了拓展性:将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为;
9、模板方法模式的缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
10、模板方法模式的案例场景
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;
控制子类的扩展。
例如:日志管理系统
开发中常见场景:
其实,各个框架中,都有模板方法模式的影子。
数据库访问的封装
Junit单元测试
servlet中关于doGet/doPost方法的调用
Hibernate中模板程序
spring中JDBCTemplate,HibernateTemplate等等
网友评论