设计模式学习-模板方式模式Template Method
模板方式
好处包括
1:能够解决代码冗余问题
2:把某些算法步骤延迟到子类,子类可以根据不同情况改变/实现这些方法,而子类的新方法不会引起既有父类的功能变化
3:易于扩展
4:父类提供了算法的框架,控制方法执行流程,而子类不能改变算法流程,子类方法的调用由父类模板方法决定,执行步骤的顺序有时候非常重要,我们再容器加载和初始化资源时,为避免子类执行错误的顺序,经常使用该模式限定子类方法的调用顺序
5:父类可以把那些重要的不允许改变的方法屏蔽掉,不让子类去覆写(Override/Overwrite)它们。如java的final活private即可
引入回调:
例如,查询数据库的记录,首先获取Connection对象,然后创建Statement实例并执行相关查询,最后处理查询结果并在整个执行过程中处理异常。可发现,除了处理查询结果不一样,其他都是一样的,则可用模板方法模式,但是由于各种各样查询太多,则需要创建很多子类处理查询结果。引入回调。
回调表示一段可执行逻辑的引用(或指针),我们把该引用传递到另外的一段逻辑或者方法里供这段逻辑适时调用。可参考Spring JDBCTemplate的实现,它就使用了这个模式
[来自《java与模式》]
模板方法模式是类得行为模式。准备一个抽象类,讲部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法迫使子类实现剩余的逻辑。
模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则给出这个算法的哥哥逻辑步骤。代表这些具体逻辑步骤的方法称作基本方法,而将这些基本方法总汇起来的方法叫做模板方法。
模板方法在代码重构中的应用
1)将大方法打破
2)建立取值方法
因为1)实现后,原来在方法内部声明的属性原本是局部变量。为了能将这些变量与基本方法共享,有2方法:一是将它们改为超累层次上的私有或者保护变量;二是建立一些抽象取值方法,而将取值方法的实现推迟给子类。也就是说,每个变量都封装在一个方法里面,这个方法所作的唯一事情就是返还这个变量。
这样做的好处是可以将状态的声明尽量推迟到子类,而使得等级结构的高端与状态无关
3)建立常量方法。
常量也应当以常量取值方法的形式封装起来。