感冒了,一直流大鼻涕,扁桃体肿的跟个桃似的,脑袋晕晕的,非常难受,坚持学习。哦对,一直忘了说这一系列博客参考的书是《图解设计模式》。
模板方法模式,最突出的就是模板二字,肯定会想到接口或者抽象类之类的东西,定制一些标准,以便子类继承或实现,达到复用的目的。
接下来看书中对template method模式的解释:
组成模板的方法定义在父类中,这些方法是抽象方法,并没有规定做如何处理,交由子类实现,只知道这些方法在父类中如何被使用,也就是相当于父类定义了一些流程处理的框架,而框架的细节都需要字类自己定义。
来看示例,定义一个父类AbstractDisplay用于输出5次内容,该父类有抽象方法:open、close、print,以及普通方法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();
}
}
接着我们按已经给定的父类实现两个类,分别用来展示字符和字符串:
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
public void setCh(char ch) {
this.ch = ch;
}
public char getCh() {
return this.ch;
}
@Override
public void open() {
System.out.println("charDisplay open");
}
@Override
public void print() {
System.out.println(ch);
}
@Override
public void close() {
System.out.println("charDisplay close");
}
}
public class StringDisplay extends AbstractDisplay {
private String string;
public StringDisplay(String string) {
this.string = string;
}
public void setString(String string) {
this.string = string;
}
public String getString() {
return this.string;
}
@Override
public void open() {
System.out.println("stringDisplay open");
}
@Override
public void print() {
System.out.println(string);
}
@Override
public void close() {
System.out.println("stringDisplay close");
}
}
如上,继承的子类只是实现了父类要求实现的具体细节,整个输出流程还是掌握在父类手中,测试一下:
public class Main {
public static void main(String[] args) {
AbstractDisplay charDisplay = new CharDisplay('e');
charDisplay.display();
System.out.println();
AbstractDisplay stringDisplay = new StringDisplay("hello");
stringDisplay.display();
}
}
运行结果:
charDisplay open
e
e
e
e
e
charDisplay close
stringDisplay open
hello
hello
hello
hello
hello
stringDisplay close
顶不住了,头晕,撩了