设计模式之模板方法模式

模板方法模式(Template Method),其含义是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是由抽象父类控制顶级逻辑,并把基本操作的实现推迟,这样通过继承的手段来达到对对象的复用。

其适用性:

一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现,

各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是”重分解以一般化“的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码,

控制子类的扩展,模板方法只在特定点调动”hook“操作,这样就只允许在这些点进行扩展。

 其结构图:

                           

ConcreteClass靠AbstractClass来实现算法中不变的步骤,顶层的父类所定义的行为成为顶级行为,其逻辑成为顶级逻辑,抽象模板定义一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤 。

 本文的实现较为简单,Template基类定义了两个基本原语操作,有两个具体的实现类,ConcreteClassA和ConcreteClassB类实现具体的方法,在客户端直接调用相对简单:

 package org.designpattern.behavioral.template;

public abstract class Template {
    public  void templateMethod(){
        primitiveOperationA();
        primitiveOperationB();
    }

    public abstract void primitiveOperationA();
    public abstract void primitiveOperationB();
}

  具体的实现类如下(在此只列举一个):

package org.designpattern.behavioral.template;

public class ConcreteTemplateA extends Template {
    @Override
    public void primitiveOperationA() {
        //To change body of implemented methods use File | Settings | File Templates.
        System.out.println("operationA implemented by concreteTemplateA");
    }

    @Override
    public void primitiveOperationB() {
        //To change body of implemented methods use File | Settings | File Templates.
        System.out.println("operationB implemented by concreteTemplateA");
    }

} 

  客户端测试类:

 package org.designpattern.behavioral.template;

public class Main {
    public static void main(String[] args) {
        Template templateA = new ConcreteTemplateA();
        Template templateB = new ConcreteTemplateB();

        templateA.templateMethod();
        templateB.templateMethod();
    }
}

  模板方法是一种代码复用的基本技术,提取了类库中的公共行为,其充分体现了“好莱坞”原则——"别找我们,我们找你",它由父类完全控制子类的逻辑,这既是控制反转,子类可以实现父类的可变部分,但要继承父类的逻辑,且不能改变业务逻辑,这就是模板方法模式的实现思想。

模板方法模式把不变的行为转移到超类中以去除子类中重复的代码,从而提供了很好的代码复用平台,这样最小化了变化对系统的影响。在实际应用中,应充分发挥此模式的复用能力,减少编程复杂度。 

posted on 2013-08-05 21:53  糊涂先生  阅读(237)  评论(0编辑  收藏  举报