【设计模式学习笔记】模板模式

模板模式

  • 解决的问题
    复用和扩展
    复用:将不变的逻辑放到父类的模板方法里,可变的逻辑放到子类中实现。然后统一调用父类的模板方法去执行。也就是说所有的子类可以复用父类中的模板方法。
    扩展(框架的扩展性):类似于控制反转。
    控制反转:抽象出一个类,类里面一部分是固定的逻辑,一部分是接口,留给子类实现。不管有多少子类基于这个类去实现,最后都是通过抽象类里的固定逻辑去运行。

  • 定义
    在一个方法中定义一个整体的框架,将框架中的某些步骤放到子类中实现。子类可以在不改变框架结构的情况下,重新定义某些步骤的实现。

  • 实现
    创建一个抽象类,在类里面定义一个模板方法(设为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)代码实现上,差别很大。回调使用组合,模板模式使用继承。

posted @ 2022-05-29 09:25  Shengjie  阅读(23)  评论(0编辑  收藏  举报