JAVA設計模式之模板方法模式
概念:
模板方法模式(template method),模板方法定義一個操作中的算法骨架,將某些步驟延遲到子類中實現。這樣,新的子類可以在不改變一個算法結構的前提下重新定義該算法的某些特定步驟。
在某些類的算法中,用了相同的方法,造成代碼的重複。控制子類擴展,子類必須遵守算法規則。
角色
抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。
具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。
應用
- 數據庫訪問的封裝
- Junit單元測試
- servlet中關於doGet和doPost方法調用
- Hibernate中的模版程序
- spring中JDBCTemplate、HibernateTemplate等
代碼
public abstract class BankTemplateMethod {
public void takeNumber() {
System.out.println("take number");
}
// 鉤子方法
public abstract void transact();
public void evaluate() {
System.out.println("反饋");
}
// 模板方法,子類不重寫, final
public final void process() {
this.takeNumber();
// 類似鉤子,子類實現
this.transact();
this.evaluate();
}
}
public class DrawMoney extends BankTemplateMethod {
@Override
public void transact() {
System.out.println("get money");
}
}
public class Main {
public static void main(String[] args) {
BankTemplateMethod btm = new DrawMoney();
btm.process();
// 匿名內部類
BankTemplateMethod btm2 = new BankTemplateMethod() {
@Override
public void transact() {
System.out.println("save monsy");
}
};
btm2.process();
}
}
總結
優點
模板方法模式通過把不變的行爲搬移到超類,去除了子類中的重複代碼。
子類實現算法的某些細節,有助於算法的擴展。
通過一個父類調用子類實現的操作,通過子類擴展增加新的行爲,符合“開放-封閉原則”。
缺點
每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。