(2024.05.05 Sun)
模版方法是一种行为设计模式,该方法在超类(superclass)中定义了算法的骨架(skeleton),并允许子类在不改变算法结构的前提下可以重写(override)特定步骤。
该方法促进了代码复用,在超类中封装(encapsulate)了算法的结构,并允许子类提供算法中特定步骤的具体实现,提供了灵活性和定制化。
模版方法有几个特征:
- 整体的算法结构和序列在超类/父类/母类中保留
- 模版意味着类似于HTML这样的预设格式;相似地在模版方法中,提供预设的结构(称作模版方法),该结构由单独的步骤组成
- 单独的步骤可以是抽象方法,由子类实现
Components
模版方法中有如下四个部分
-
抽象类/接口(Abstract Class/Interface)
用于定义模版方法的朝里,提供了算法的骨干/架构,其中定义了特定步骤,而其他的步骤设置为抽象方法,或定义为钩子(hooks)可被子类覆盖(override)。抽象类同样可以包括具体方法,可被子类共用。 -
模版方法(Template Method)
抽象类中的方法,定义了算法的结构,通过特定顺序调用其他方法。该方法可声明以防止子类改变算法的结构。模版方法包含了一系列对其他方法的调用(不管是抽象或是具体实现)。 -
抽象方法/钩子方法(Abstract/Hook Methods)
抽象方法在抽象类中声明了未实现的方法。抽象方法类似于placeholder,在子类中实现。子类必须实现这些方法的具体操作以实现完整的算法。 -
具体子类(Concrete Subclasses)
子类扩展了抽象类,提供了抽象类中抽象方法的具体实现。每个子类可以覆盖算法中的特定步骤用于定制算法的行为而无需改变整体算法结构。
下图是一个具体案例
优缺点
优点:
- 用户可以覆盖算法中的特定部分,而不影响算法中其他部分
- 将复用的代码放在超类中
缺点:
- 用户可能被算法的流程/骨架所限制
- 可能与Liskov替代原则冲突,比如在子类中覆盖超类中默认的运行步骤
- 当算法的步骤逐渐增大,维护变得困难
与其他模式的关系
- 工厂方法是模版方法的特例,而且工厂方法也可以成为一个更大的模版方法中的一个步骤
- 模版方法基于继承(inheritance),可以在子类中扩展算法中抽象方法。策略模式基于创作/写作(composition),改变对象的行为通过针对不同行为提供不同的策略。模版模式关注类级(class level),而策略模式关注对象级(object level),可在运行时调整行为。
Reference
1 refactor点guru,template method
2 geeksforgeeks
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...