【设计模式学习笔记】模板模式
模板模式
-
解决的问题
复用和扩展
复用:将不变的逻辑放到父类的模板方法里,可变的逻辑放到子类中实现。然后统一调用父类的模板方法去执行。也就是说所有的子类可以复用父类中的模板方法。
扩展(框架的扩展性):类似于控制反转。
控制反转:抽象出一个类,类里面一部分是固定的逻辑,一部分是接口,留给子类实现。不管有多少子类基于这个类去实现,最后都是通过抽象类里的固定逻辑去运行。 -
定义
在一个方法中定义一个整体的框架,将框架中的某些步骤放到子类中实现。子类可以在不改变框架结构的情况下,重新定义某些步骤的实现。 -
实现
创建一个抽象类,在类里面定义一个模板方法(设为final,子类不可重写),方法里编写调用其他方法的逻辑。然后定义几个抽象方法,子类可以重写。
创建N个子类,继承自抽象类,在子类里重写抽象类里的抽象方法。
然后调用的时候,可以通过子类创建实例,调用父类的模板方法。 -
问题
如果在一个抽象类里,有两个以上的模板方法,并且有很多的抽象方法必须要子类实现。但是当仅用其中一个模板方法时,需要的抽象方法不多。如何解决每个子类继承自该抽象类必须重写所有抽象方法的问题?
几个思路,不一定对:
(1)创建一个适配器类继承自父类,实现所有抽象方法。然后子类继承自这个适配器类。重写自己所需的抽象方法。
(2)拆成N个以上类。
正确答案:
使用回调函数,只需要往用到的模板方法中注入回调对象即可.
-
回调函数
A类注册一个函数F给B类,A类调用B类的P函数,B类反过来调用A之前注册给它的F函数。F函数就是回调函数。简而言之,回调就是A调用B,B反过来又调用A。 -
实现
Java的实现:在A类里调用B类的时候,先创建一个B类的对象,然后再调用B对象的方法。将回调函数作为一个对象从A类里传给B类的方法,在B类里的这个方法接收回调函数的对象,并且在方法里调用回调函数。 -
同步回调
在函数返回之前执行回调函数,类似于模板模式。 -
异步回调(延迟回调)
在函数返回之后执行回调函数,类似于观察者模式。 -
回调和模板模式的异同
(1)应用场景上,同步回调和模板模式几乎一致。异步回调和模板模式有较大差别,更像是观察者模式。
(2)代码实现上,差别很大。回调使用组合,模板模式使用继承。