设计模式之:模版方法
二话不多说直接上代码
1、先定义一个抽象类(父类)
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();
}
}
父类负责把方法之间的调用进行组合,把具体的事情交给子类去实现,父类相当于一个统管调用的角色
2、定义一个「字符串」组装类(子类)
public class StringDisplay extends AbstractDisplay {
private String message;
private int width;
public StringDisplay(String message) {
this.message = message;
this.width = message.getBytes().length;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + message + "|");
}
@Override
public void close() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
子类继承父类,去实现父类中未实现的抽象方法
3、定义一个「字符」组装类(子类)
public class CharDisplay extends AbstractDisplay {
private char ch;
public 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(">>");
}
}
第二个子类,方便对比出效果,都是组转字符输出到控制台,实际业务中需要方法传参进行业务逻辑处理
4、Main方法测试
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
d1.display();
AbstractDisplay d2 = new StringDisplay("Hello World.");
d2.display();
}
}
<<HHHHH>>
+------------+
|Hello World.|
|Hello World.|
|Hello World.|
|Hello World.|
|Hello World.|
+------------+
5、总结
在 Template Method 模式中,处理的流程被定义在父类中,而具体的处理则交给了子类。但是对于“如何划分处理的级别,哪些处理需要由父类完成,哪些处理需要交给子类负责”并没有定式,这些都需要由负责程序设计的开发人员来决定。