模板方法是利用繼承來完成切割,當對耦合性要求比較高,無法使用繼承的時候,可以
橫向切割,也就是使用橋接模式。
我們還是通過上面的關於支付的簡單例子可以說明它的原理。
顯然,它具備和模版方法相類似的能力,但是不採用繼承。
public class Payment{
private double amount;
public double getAmount(){
return amount;
}
public void setAmount(double value){
amount = value;
}
private Implementor imp;
public void setImp(Implementor s){
imp=s;
}
public String goSale(){
String x = "不變的流程一 ";
x += imp.Action(); //可變的流程
x += amount + ", 正在查詢庫存狀態"; //屬性和不變的流程二
return x;
}
}
interface Implementor{
public String Action();
}
class CashPayment implements Implementor{
public String Action(){
return "現金支付";
}
}
調用:
public class Test{
public static void main (String[] args){
Payment o=new Payment();
o.setImp(new CashPayment());
o.setAmount(555);
System.out.println(o.goSale());
}
}
假定系統已經投運,使用者提出新的需求,要求加上信用卡支付和支票支付,您將怎樣處
理呢?
public class CreditPayment implements Implementor{
public String Action(){
return "信用卡支付,聯絡支付機構";
}
}
class CheckPayment implements Implementor{
public String Action(){
return "支票支付,聯絡財務部門";
}
}
調用:
public class Test{
public static void main (String[] args){
Payment o=new Payment();
o.setImp(new CashPayment());
o.setAmount(555);
System.out.println(o.goSale());
o.setImp(new CreditPayment());
o.setAmount(555);
System.out.println(o.goSale());
o.setImp(new CheckPayment());
o.setAmount(555);
System.out.println(o.goSale());
}
}
這樣就減少了系統的耦合性。而在系統升級的時候,並不需要改變原來的代碼。