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(); } }
- 控制台显示: