1、意圖
軟體複用的關鍵是尋找相似性,在很多情況下,相似性表現為商務程序相似,但是業務
單元具有特殊性。如果是這種情況,可以定義一個操作中的商務程序骨架,而將一些業務單
元的實現延伸到子類中去,使得子類可以不改變一個商務程序的的結構,即可重新定義該業
務流程的某些特定業務單元。這裡需要複用的是商務程序的結構,也就是操作步驟,而步驟
的實現(或者是業務單元的實現)可以在子類中完成。
2、使用場合
1)一次性實現一個商務程序的不變部分,並且將可變的行為留給子類來完成。
2)各子類公用的行為應該被提取出來並集中到一個公用父類中以避免代碼的重複。首
先識別現有業務的不同之處,並且把不同部分分離為新的操作,最後,用一個調用這些新的
操作的模板方法來替換這些不同的代碼。
3)控制子類的擴充。
3、結構
模板方法的結構是使用一個抽象類別,在抽象類別中定義模板方法的關鍵是:
在一個非抽象方法中調用調用抽象方法,而這些抽象方法在子類中具體實現。
代碼:
public abstract class Payment{
private double amount;
public double getAmount(){
return amount;
}
public void setAmount(double value){
amount = value;
}
public String goSale(){
String x = "不變的流程一 ";
x += Action(); //可變的流程
x += amount + ", 正在查詢庫存狀態"; //屬性和不變的流程二
return x;
}
public abstract String Action();
}
class CashPayment extends Payment{
public String Action(){
return "現金支付";
}
}
測試:
public class Test{
public static void main (String[] args){
Payment o;
o = new CashPayment();
o.setAmount(555);
System.out.println(o.goSale());
}
假定系統已經投運,使用者提出新的需求,要求加上信用卡支付和支票支付,可以這樣寫:
public class CreditPayment extends Payment{
public String Action(){
return "信用卡支付,聯絡支付機構";
}
}
class CheckPayment extends Payment{
public String Action(){
return "支票支付,聯絡財務部門";
}
}
調用:
public class Test{
public static void main (String[] args){
Payment o;
o = new CashPayment();
o.setAmount(555);
System.out.println(o.goSale());
o = new CreditPayment();
o.setAmount(555);
System.out.println(o.goSale());
o = new CheckPayment();
o.setAmount(555);
System.out.println(o.goSale());
}
}