个人认为模版方法模式应该是设计模式中最好理解的一种设计模式了,因为在我们的生活中处处可以看到运用这种思想的事物。譬如不同颜色的同种类型的车,他们在制造过程中,除了喷漆这一步骤不同外,其余步骤都是一样的,因此可以将相同的生产流程抽象出来,做成一个流水线,也就是做一个模板,此后生产汽车只遇到按照模板定义的流程依样画葫芦即可。
这就是模板模式,在父类中定义处理流程的框架,在子类中实现具体处理。
假设现在有这么个程序需要我们编写,我们需要输出三部分内容,分别为:
开始符输入内容结束符而输入内容类型分为字符和字符串,当输入为字符时,开始符和结束符分别为 “<<” 和 “>>”;当输入为字符串时,开始符和结束符都为字符串长度的 “+ - - - - - -+”。【ps:此处减号与加号是连续的,因为博客编写规则,连在一起会合为一个符号,所以间隔着写】。 根据程序要求,很清楚的就可以看到,虽然每个步骤具体要做的事情不一样,但是程序流程是确定的,也就是依次输出 “开始符”、“输入内容” 和 “结束符”,因此可以定义如下抽象类:
public abstract class AbstractDisplay { public abstract void open(); public abstract void print(); public abstract void close(); public final void display() { open(); print(); close(); } }通过抽象方法 display 定义程序流程,而具体的程序实现由子类来进行控制,子类代码如下:
public class CharDisplay extends AbstractDisplay { private char c; public CharDisplay(char c) { this.c = c; } @Override public void open() { System.out.print("<<"); } @Override public void print() { System.out.print(c); } @Override public void close() { System.out.println(">>"); } } public class StringDisplay extends AbstractDisplay { private String string; public StringDisplay(String string) { this.string = string; } @Override public void open() { printLine(); } @Override public void print() { System.out.println("|" + string + "|"); } @Override public void close() { printLine(); } private void printLine() { System.out.print("+"); for (int i = 0; i < string.getBytes().length; i++) { System.out.print("-"); } System.out.println("+"); } }CharDisplay 类和 StringDisplay 类分别实现了各自的 open、print 和 close 方法,最后在继承自父类的 display 方法中依次执行,测试代码如下:
public class Main { public static void main(String[] args) { AbstractDisplay d1 = new CharDisplay('H'); AbstractDisplay d2 = new StringDisplay("Hello, World"); AbstractDisplay d3 = new StringDisplay("你好,世界"); d1.display(); d2.display(); d3.display(); } }