超类中定义处理流程的框架,在子类中实现具体的处理逻辑,这种就是Template Method模式
这种模式带有模板功能,组成模板的方法定义在超类中,但是都是抽象方法,具体都是在子类中实现的,但是具体处理流程是在超类中定义
比如一个案例,放任意传入的字符和字符串循环显示5次最终输出
定义的类如下:
AbstractDisplay:实现了display模板方法的抽象类
CharDisplay:实现了open,print,close方法的类
StringDisplay:实现了open,print,close方法的类
Main:测试类
首先是AbstractDisplay类,定义了display,open,print,close方法,其中open,print,close都是抽象方法,display实现了具体处理流程,调用了其它3个抽象方法
package method.template;
/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: AbstractDisplay
* Author: lihui
* Date: 2018/4/30 14:23
*/
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
然后是CharDisplay类,继承了超类AbstractDisplay,重写了3个抽象方法,主要功能是将输入的字符输入5次放在<<>>中间
package method.template;
/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: CharDisplay
* Author: lihui
* Date: 2018/4/30 14:25
*/
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
接着是StringDisplay类,继承了超类AbstractDisplay,同样重写了open,print,close,功能就是将输入的字符串以table的形式显示5次
package method.template;
/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: StringDisplay
* Author: lihui
* Date: 2018/4/30 14:26
*/
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + string + "|");
}
@Override
public void close() {
printLine();
}
}
最后main,输入字符和字符串即可
package method.template;
/**
* Copyright (C), 2014-2018, maoxiaomeng.com
* FileName: Main
* Author: lihui
* Date: 2018/4/30 14:30
*/
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello, LiHui~!");
d1.display();
d2.display();
}
}
这种模式比较直接,相关角色如下
AbstractClass(抽象类):例子中的AbstractDisplay类;负责实现模板方法,并且在模板方法中使用相关抽象方法,这些抽象方法由子类来负责实现
ConcreteClass(具体类):例子中的CharDisplay和StringDisplay类;负责实现AbstractClass角色中定义的抽象方法
Template Method模式使得流程都在超类的模板方法中完成,每个子类中不需要再来实现处理流程逻辑,因此如果有需要修改,也只修改模板方法即可;假如没有该设计模式,那么每种处理流程都需要单独一个类来完成,而这些流程基本都是类似的,假如发现有逻辑错误,每个类都要相应地进行修改