1、什么是模版方法模式?
在父类中定义处理流程的框架,在子类中实现具体处理的模式被称为Template Method模式。
2、代码
2.1、AbstractDisplay是父类,定义了处理流程
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
//具体的处理流程,定义成final表示不让子类重写
public final void display(){
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
2.2、CharDisplay是打印字符子类,负责三个方法的具体实现
public class CharDisplay extends AbstractDisplay {
private char ch;
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(">>");
}
}
2.3、StringDisplay是打印字符串子类,负责三个方法的具体实现
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
StringDisplay(String s){
this.string = s;
this.width = s.getBytes().length;
}
@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 < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
2.4、MainTest类,测试用
public class MainTest {
public static void main(String[] args) {
AbstractDisplay charDisplay = new CharDisplay('H');
AbstractDisplay stringDisplay1 = new StringDisplay("Hello word!");
AbstractDisplay stringDisplay2 = new StringDisplay("你好,世界!");
charDisplay.display();
stringDisplay1.display();
stringDisplay2.display();
}
}
3、使用Template Method的好处
我们把具体的逻辑部分交给父类中的模版方法,至于模版房中调用的方法,这部分方法具体实现交给了子类。这样不需要在每个子类中重写模版方法。
假如我们在逻辑中发现了bug,无需修改所有的子类,只需要修改父类***模版方法***即可。