1、什么是交给子类
在一个程序中,在相继承的类中,充当父类的类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式。
2、理解示例
例子中,固定一个输出程序,固定输出框架实现输出字符和字符串不同输出情况时的输出。
\ | 类型 | 名 | 角色 |
---|---|---|---|
1 | 抽象类 | AbstractDisplay | 只实现了display方法的抽象类 |
2 | 类 | CharDisplay | 实现了open、print、close方法的类 |
3 | 类 | StringDisplay | 实现了open、print、close方法的类 |
4 | 入口 | Main | 程序入口 |
抽象类AbstractDisplay中有三个抽象方法和一个定义了流程框架方法。该类只实现了处理流程的框架且时display无法被重写
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与StringDisplay各自实现了各自的open,print,close方法。
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch){
this.ch = ch;
}
public void open() {
System.out.print("<<");
}
public void print() {
System.out.print(ch);
}
public void close() {
System.out.println(">>");
}
}
private String string;
private int width;
public StringDisplay(String string){
this.string = string;
this.width = string.getBytes().length;
}
public void open() {
printLine();
}
public void print() {
System.out.println("|"+string+"|");
}
public void close() {
printLine();
}
private void printLine(){
System.out.print("+");
for(int i = 0;i<width;i++){
System.out.print("-");
}
System.out.println("+");
}
}
public class Main {
public static void main(String [] agrs){
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello,world");
AbstractDisplay d3 = new StringDisplay("你好,世界");
d1.display();
d2.display();
d3.display();
}
}
运行结果
在程序中,父类就像一个指挥战场的将军,其下继承他的子类各司其职。这使程序中实现部分不一,但流程相同的部分不会再次实现流程而导致代码冗余。利用Chardisplay与Stringdisplay的继承类Abstractdisplay来使用dispaly,当流程中的出现bug只需要修改Abstractdisplay中的方法即可。
网友评论