什么是Template Method模式
Template Method模式是带有模板功能的模式,组成模板的方法定义在父类中。由于这些方法是抽象的,所以只查看父类的代码是无法知道这些方法会进行具体的处理。唯一知道的就是父类如何调用这些方法。这些抽象类在子类中进行实现,不同的子类,父类模板方法被调用时程序也会不同。但是无论如何实现,处理的流程都会按照父类中所定义那样进行。
像这样在父类中定义处理流程的框架,在子类事项具体处理的模式就称为Template Method模式。
示例程序
package Class;
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();
}
}
package Class;
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch=ch;
}
@Override
public void open() {
System.out.println("<<");
}
@Override
public void print() {
System.out.println(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
package Class;
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string=string;
}
@Override
public void open() {
printLine();
}
private void printLine() {
System.out.println("+");
for(int i=0;i<width;i++) {
System.out.println("-");
}
System.out.println("+");
}
@Override
public void print() {
System.out.println("|"+string+"|");
}
@Override
public void close() {
printLine();
}
}
package Class;
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();
}
}
相关的设计模式
Factory Method模式
Strategy模式
延伸阅读:类的层次与抽象类
父类对子类的要求
我们在理解类的层次时,通常是站在子类的角度考虑进行思考的。也就是说,很容易着眼于一下几点:
1、在子类中可以使用父类中定义的方法。
2、可以通过在子类中增加方法以实现新的功能。
3、在子类中重写父类的方法可以改变程序的行为。
站在父类的角度思考。在父类中,我们声明了抽象方法,而将该方法的实现交给了子类。换言之,就程序而言。声明抽象方法是希望达到以下目的:
1、期待子类去实现抽象方法。
2、要求子类去实现抽象方法。
也就是说,子类具有实现在父类中所声明的抽象方法的责任。因此这种责任被称为“子类责任”。
抽象类的意义
对于抽象类。我们是无法生成实例的。由于在抽象方法中并没有写具体的实现,所以我们无法知道抽象方法到底进行了什么处理。但我们可以决定抽象方法的名字,然后通过调用使用了抽象方法的模板方法去编写处理。虽然具体处理美瞳是由子类决定的,不过在抽象结对确定处理流程非常重要。
父类与子类之间的协作
父类与子类的相互协作支撑起了整个程序。虽然将更多的方法实现放在了父类会让子类变得更轻松,但是同时也降低了子类的灵活性;繁殖,如果父类中实现的方法过少,子类就会变得臃肿不堪。而且还会导致各子类间的代码重读、