利用裝飾器模式封裝核心業務單元

來源:互聯網
上載者:User

有的時候,希望實現一個基本的核心代碼快,由外圍代碼實現專用效能的封裝,最簡單
的方法,是使用超類,但是超類使用了繼承而提升了耦合性。在這樣的情況下,也可以使用
裝飾器模式,這是用組合取代繼承的一個很好的方式。
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;
}
}
可以說,這是在使用者不知曉的情況下,也不更改原來的類的情況下,改變了效能。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.