大战设计模式【11】—— 模板方法模式
模板方法模式(Template Method)
设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample
一、定义
定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的特定步骤。
二、结构
AbstractClass(抽象类):在抽象类中定义了一系列基本操作(Primitive Operations)
这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重新定义或实现这些步骤。
同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架。
ConcreteClass(具体子类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
三、优点
模板方法中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责和开闭原则。
四、缺点
需要为每一个基本方法的不同实现一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也会更加抽象。
五、应用场景
对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。
需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
六、个人总结
1、模板方法模式的实现步骤:
将两个具有相同算法结果方法的类提出公共的部分
将算法固定不变的部分设计为模板
父类抽象一些必须由子类重写的方法
父类实现一些一定不需要子类重写的方法
父类实现一些方法,子类可以重写,也可以不重写(称为钩子hook)
2、模板方法模式的重点就是提出了公共的部分(模板)
这个设计模式的优点在于父类对可以通过控制方法重写的权限来控制子类;子类可以通过是否重写方法来控制父类中的模板;
3、模板方法模式的长相很多,符合上述描述的都可以称为模板方法,所以很多时候模板方法被使用了但不知道被使用了