模版方法模式
定义
Define the skeleton of an algorithm in an operation, defer-ring some steps to subclasses. Template Method lets subclassesredefine certain steps of an algorithm without changing the al-gorithm's structure.(在父类中处理处理流程的框架,在子类中实现具体处理的模式称为模板方法模式)
类图:略
优点
- 封装不变部分,扩展可变部分
- 提取公共部分代码,方便维护
- 行为由父类控制,子类实现
缺点
- 和依赖倒置原则相违背
- 复杂项目中可读性差
使用场景
- 多个子类有公共方法,并且逻辑基本相同
- 重要复杂的算法,可以把核心算法交由父类,核心算法交给子类
- 重构时,将公共方法抽取到父类,具体实现写成抽象方法,或者钩子函数,交由子类完成
用例
父类
public abstract class AbsstractDisplay {
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 AbsstractDisplay {
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(">>");
}
}
public class StringDisplay extends AbsstractDisplay {
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 Test {
public static void main(String[] args) {
AbsstractDisplay display1=new CharDisplay('A');
AbsstractDisplay display2=new StringDisplay("模版方法模式");
AbsstractDisplay display3=new StringDisplay("So easy");
display1.display();
display2.display();
display3.display();
}
}
运行结果:
<<AAAAA>>
+------------------+
|模版方法模式|
|模版方法模式|
|模版方法模式|
|模版方法模式|
|模版方法模式|
+------------------+
+-------+
|So easy|
|So easy|
|So easy|
|So easy|
|So easy|
+-------+
不建议这样做
- 把子类传递到弗雷的有参构造器中,然后调用
- 使用反射的方式调用(破坏了封装性)
- 父类调用子类的静态方法。