1.什么是Template Method模式
Template Method模式是带有模板功能的模式,组成模板的方法被定义在父类中。由于这些方法是抽象方法,所以只能查看父类的代码是无法知道这些方法最终会进行何种具体处理的,唯一能知道的就是父类如何调用这些方法。
实现上述这些抽象方法的是子类。在子类中实现了抽象方法也就决定了具体的处理。也就是说,只要在不同的子类中实现不同的处理,当父类的模板方法被调用时程序行为也会不同。但是,不论子类中的 具体实现如何,处理的流程都会按照父类所定义的那样进行。
像这样在父类中规定处理流程的框架,在子类实现具体处理的模式就称为Template Method模式
2.示例程序
类的一览表
名字 | 说明 |
AbstractDisplay | 只实现了display方法的抽象方法 |
CharDisplay | 实现了open,print,close方法的类 |
stringDisplay | 实现了open,print,close方法的类 |
Main | 测试程序行为的类 |
示例程序的类图
AbstractDisplay类
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类
public class CharDisplay extends AbstractDisplay{
private char ch;
public CharDisplay(char ch){
this.ch = ch;
}
public void open(){
System.out.println("<<");
}
public void print(){
System.out.println(ch);
}
public void close(){
System.out.println(">>");
}
}
StringDisplay类
public class StringDisplay extends AbstractDisplay{
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.println("+");
for (int i = 0;i < width;i++){
System.out.println("-");
}
System.out.println("+");
}
}
Main类
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();
}
}
3.Temolate Method模式中的登场角色
AbstractClass(抽象类)
该角色不不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。这些抽象方法由子类ConcreteClass角色负责实现。在示例程序中,由AbstractDisplay方法实现
ConcreteClass(具体类)
该角色负责实现AbstractClass角色中定义的抽象方法。这里实现的方法将会在AbstractClass角色的模板方法中被调用。在示例程序中,由CharDisplay类和StringDisplay类扮演
4.拓展思路的要点
可以使逻辑处理通用化
使用Template Method模式进行变成,当我们在模板方法中发现BUG时,只需要修改模板方法的代码
父类与子类之间的协作
在Template Method模式中,父类和子类是紧密联系,共同工作的。因此,在子类中实现父类中声明的抽象方式时,必须要理解这些抽象方法被调用的实际。在看不到父类的源代码的情况下,想要编写子类是非常困难的
父类与子类的一致性
使用父类类型的变量保存子类实例的优点是,及时没有用instanceof等指定子类的种类,程序也能正常工作
5.类的层次与抽象类
我们在理解类的层次是,通常是站在子类的角度进行思考的。也就是说,很容易着眼于以下几点
(1)在子类中可以使用父类中定义的方法
(2)可以通过在子类中增加方法以实现新的功能
(3)在子类中重写父类的方法可以改变程序的行为
现在,让我们稍微改变一下立场,站在父类的角度进行思考。在父类中,我们声明了抽象方法,而将该方法的实现交给了子类。换而言之,就程序而言,声明抽象方法就是希望达到以下几点:
(1)期待子类去实现抽象方法
(2)要求子类实现抽象方法
也就是说,子类具有实现在父类中所声明的抽象方法的责任。因此,这种责任被成为“子类责任”