定义:
模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义了一个操作的算法骨架,而将一些步骤的具体实现延迟到子类中。通过这种方式,可以重新定义算法的某些步骤而不改变算法的结构。
上述定义可能有点晦涩难懂,简单来说:就是定义一套固定流程,子类只能按照这个流程走,至于流程里面具体的动作,由子类去定义,比如生活中定义一个喝水的流程,先拿杯子,再倒水,再喝水,子类A和子类B喝水都要遵循这个流程,但是具体拿的是玻璃杯还是塑料杯,倒的是茶水还是咖啡,用吸管喝还是用勺子喝这个就由子类具体去定义。
实现方式
按照如上定义,就是需要有一个定义流程的抽象类,和实现具体动作的具体子类:
抽象类(Abstract Class):包含一个定义流程的模板方法,模板方法里面固定了一套流程步骤,为了保证流程不会被修改,因此模板方法需要设置为final,每个步骤对应一个抽象方法,由子类去具体实现。
具体类(Concrete Class):实现抽象类中的抽象方法,实现具体的动作,但是流程还是得用模板方法的流程。
实战案例
解释:
上述案例定义了一套报表查询的流程,其实就是我们用查询参数去查询数据,里面的模板处理类就是模板方法,
里面定义了完整的报表查询流程,必填参数校验->查询参数处理->查询前处理->查询数据->查询后处理,这套流程是固定的,但是具体的每一步都定义为抽象方法由子类去实现。
优缺点
以下是模板方法模式的优点:
- 代码复用:模板方法定义了算法的骨架,使得公共的、可复用的代码集中在一个方法中,从而避免了代码重复。
- 算法结构稳定:由于算法的结构定义在父类中,并且被子类所继承,所以算法的结构是稳定的,子类只能通过重写父类的特定步骤来改变算法的行为。
- 易于扩展:如果需要添加新的算法步骤或者改变现有步骤的行为,只需要在对应的子类中实现或修改即可,而不需要修改其他的类。
- 符合开闭原则:模板方法模式对扩展开放,对修改封闭。新的算法步骤可以通过添加新的子类来扩展,而不需要修改原有的代码。
然而,模板方法模式也存在一些缺点:
- 子类数量增加:如果算法中有很多步骤需要被子类重写,那么可能会导致子类数量过多,使得系统的复杂性增加。
- 违反里氏替换原则:在某些情况下,子类可能无法完全遵循父类的约定,导致在使用子类替换父类时出现问题。这通常是因为父类定义的模板方法中的某些步骤对于所有子类来说并不都是必要的。
- 过度设计:在某些情况下,过度使用模板方法模式可能会导致设计过于复杂,而实际上可能并不需要这么复杂的结构。
总的来说,模板方法模式是一种强大的设计模式,但使用时需要根据实际情况进行权衡和选择,避免过度使用或滥用。