今天的博客主题
设计模式 ——》 设计模式之模板方法模式
模板方法模式 TMP(Template Method Pattern)
定义
定义一个操作的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法实际上是封装了一个固定流程,该流程由几个步骤组成,每个步骤有不同的子类实现,从而让固定的流程产生不同得结果。很简单,就是类的继承机制,也是应用很广泛的一个模式。
其本质就是抽象封装流程,进行具体实现。
应用场景
1)当客户端需要扩展算法的特定步骤,而不是整个算法或结构时。
2)当有几个类包含几乎相同的算法,只有一些细微的差异时。
3)
优点
1)覆盖大型复杂算法的其中一小部分,减少算法其他部分发生改变的影响。
2)抽取代码到超类,提高代码复用性。
3)将不同的代码分写到不同子类,通过对子类的扩展增加新的行为,提高代码的扩展性。
4)
缺点
1)类数目增加,每一个抽象类都需要一个子类来实现。
2)类数量的增加,间接增加了系统的复杂度。
3)继承关系的自身缺点,父类添加新的抽象方法,子类都要调整。
4)
源码中的应用
javax.servlet.http.HttpServlet
org.springframework.web.servlet.mvc.AbstractController
代码示例
模板方法并不难,包含了两个角色
抽象模板(AbstractClass):抽象模板方法,定义一套算法框架或流程。
具体实现(SubClass):具体的子类实现,对算法框架或流程的某些步骤进行实现改变扩展。
// 抽象模板 定义算法骨架或流程
abstract class AbstractClass{
public void operation(){
System.out.println("必执行的算法或流程");
templateMethod();
}
abstract protected void templateMethod();
}
// 具体子类实现
class SubClassA extends AbstractClass{
@Override
protected void templateMethod() {
System.out.println("executed A ...");
}
}
class SubClassB extends AbstractClass{
@Override
protected void templateMethod() {
System.out.println("executed B ...");
}
}
// 客户端调用
public class TemplateMethodPattern {
public static void main(String[] args) {
AbstractClass ac = new SubClassA();
ac.operation();
ac = new SubClassB();
ac.operation();
}
}
// 输出结果
必执行的算法或流程
executed A ...
必执行的算法或流程
executed B ...