有的時候,希望實現一個基本的核心代碼快,由外圍代碼實現專用效能的封裝,最簡單
的方法,是使用超類,但是超類使用了繼承而提升了耦合性。在這樣的情況下,也可以使用
裝飾器模式,這是用組合取代繼承的一個很好的方式。
1、意圖
事實上,上面所要解決的意圖可以歸結為“在不改變對象的前提下,動態增加它的功能”,
也就是說,我們不希望改變原有的類,或者採用建立子類的方式來增加功能,在這種情況下,
可以採用裝飾模式。
2、結構
裝飾器結構的一個重要的特點是,它繼承於一個抽象類別,但它又使用這個抽象類別的彙總
(即即裝飾類對象可以包含抽象類別對象),恰當的設計,可以達到我們提出來的目的。
假定我們已經構造了一個基於支付的簡單原廠模式的系統。現在需要每個類在調用方法
goSale()的時候,除了完成原來的功能以外,先彈出一個對話方塊,顯示工廠的名稱,而且不需
要改變來的系統,為此,在工廠類的模組種添加一個裝飾類 Decorator,同時略微的改寫一
下工廠類的代碼。
//裝飾類
public class Decorator extends Payment{
private String strName;
public Decorator(String strName){
this.strName = strName;
}
private Payment pm;
public void setPm(Payment value){
pm = value;
}
public String Action(){
//在執行原來的代碼之前,顯示提示框
System.out.println(strName);
return pm.Action();
}
}
而工廠類:
//這是一個工廠類
public class Factory{
public static Payment PaymentFactory(String PaymentName){
Payment mdb=null;
if (PaymentName.equals("現金"))
mdb=new CashPayment();
else if (PaymentName.equals("信用卡"))
mdb=new CreditPayment();
else if (PaymentName.equals("支票"))
mdb=new CheckPayment();
//return mdb;
Decorator m=new Decorator(PaymentName);
m.setPm(mdb);
return m;
}
}
可以說,這是在使用者不知曉的情況下,也不更改原來的類的情況下,改變了效能。