1.简介:
定义操作中的一个算法框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义算法中的某些步骤
2结构:
模板方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:
a.抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类实现
b.模板方法:由抽象类声明并加以实现。一般来说,模板方法调用抽象方法来完成主要的逻辑,并且模板方法大多会定义为final类型,指明的主要逻辑在子类不能重写
c.钩子方法:由抽象类声明并加以实现,但是子类可以去扩展,子类通过扩展钩子方法来影响模板方法的逻辑
抽象类的任务是搭建逻辑框架,抽象的好坏直接决定了程序是否稳定
实现类用来实现细节,抽象类中的模板方法是通过实现类扩展的方法来完成业务逻辑的。只要实现类的扩展方法通过单元测试,模板方法正确,则整体功能不会出现问题
3.优点:
容易扩展。一般来说,抽象类中的模板方法是不易发生变化的部分,而抽象方法是容易发生变化的部分,通过增加实现类可以容易实现功能扩展,符合开闭原则
便于维护。对于模板方法模式而言,由于它们的主要逻辑相同,才使用了模板方法。便于维护
比较灵活。因为有钩子方法,因此子类实现也可以影响父类的逻辑。在灵活的同时,由于子类直接影响到父类,违反了里氏替换原则,也会给程序带来风险
4.适用场景:
在多个子类拥有相同的方法,并且这些方法逻辑相同,可以考虑使用模板方法模式,在程序主框架相同,细节不同的场合也可以使用这种模式。
一次性实现算法的不变部分,并且将可变的行为留给子类去完成
各子类公共的行为应该被提取出来并集中到一个公共的类中可以避免代码的重复,首先识别现有代码的不同之处,并且把不同的部分分离为新的操作,最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
控制子类的扩展