Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式。当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的那样进行。

示例程序:

将一段字符串和字符循环显示五次的程序:

  • AbstractDisplay 父类抽象的模板,里面定义了处理流程,但是没有具体把实现写出来
package site.wangxin520.gof.template;

/**
 * 模板模式的模板,使用的是抽象类和抽象方法。
 * 在此模板中,定义一个模板的实现,以及需要子类去实现的抽象方法。
 * 当子类实现抽象方法之后,便可以在本模板中固定的代码逻辑里面调用
 * @author wangXgnaw
 *
 */
public abstract class AbstractDisplay {

    /**
     * 定义一些抽象方法,具体实现等子类进行
     */
    protected abstract void open();
    protected abstract void print();
    protected abstract void close();
    
    /**
     * 定义模板执行的代码逻辑
     * 将字符串和字符循环显示5次
     */
    public final void display(){
        open();
        for (int i = 0; i < 5; i++) {
            print();
        }
        close();
    }
}
  • CharDisplay 子类实现了父类模板的抽象方法,处理字符
package site.wangxin520.gof.template;

/**
 * 字符显示操作的子类,继承模板
 * @author wangXgnaw
 *
 */
public class CharDisplay extends AbstractDisplay{

    private Character ch;
    /**
     * 构造函数
     * @param ch 传入字符参数
     */
    public CharDisplay(Character ch) {
        this.ch=ch;
    }
    
    /*
     * 后面就是重写父类模板定义的抽象方法
     * @see site.wangxin520.gof.template.AbstractDisplay#open()
     */
    @Override
    protected void open() {
        System.out.print("(");
    }

    @Override
    protected void print() {
        System.out.print(ch);
    }

    @Override
    protected void close() {
        System.out.println(")");
    }

}
  • StringDisplay 子类实现了父类的模板抽象方法,处理字符串
package site.wangxin520.gof.template;

/**
 * 字符串显示操作的模板子类,继承自模板
 * @author wangXgnaw
 *
 */
public class StringDisplay extends AbstractDisplay{

    private String string;
    
    /**
     * 构造函数,传入一个字符串
     * @param string
     */
    public StringDisplay(String string) {
        this.string=string;
    }
    
    /**
     * 后面就是重写父类的抽象方法
     */
    @Override
    protected void open() {
        System.out.println("+------------------------+");
    }

    @Override
    protected void print() {
        System.out.println(string);
    }

    @Override
    protected void close() {
        System.out.println("+------------------------+");
    }

}
  • TemplateTest 模板模式的测试类
package site.wangxin520.gof.template;

/**
 * 模板模式的测试类
 * @author wangXgnaw
 *
 */
public class TemplateTest {
    public static void main(String[] args) {
        AbstractDisplay ad1=new CharDisplay('w');
        ad1.display();
        AbstractDisplay ad2=new StringDisplay("wangxin");
        ad2.display();
    }
}
  • 控制台显示:

image

posted on 2017-09-27 06:24  博客王大锤  阅读(183)  评论(0编辑  收藏  举报