設計模式 -- 裝飾模式

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   使用   

動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比產生子類更為靈活。動態地將責任附加到對象上。若要擴充功能,裝飾者提供了比繼承更有彈性的替代方案。

具體被裝飾者和抽象裝飾類都繼承於抽象被裝飾者類,繼承的是類型,而不是行為。行為來自裝飾者和基礎組件,或與其他裝飾者之間的組合關係。

裝飾者通常是用其他類似於工廠或產生器這樣的模式建立的。

代碼說明一切                                                                               

package com.yydcdut.decorate;//被裝飾者抽象類別public interface Phone {    public void call();}
package com.yydcdut.decorate;//被裝飾者具體類public class RealPhone implements Phone {    @Override    public void call() {        System.out.println("打電話。。。");    }}
package com.yydcdut.decorate;//裝飾者抽象類別public abstract class PhoneDecorate implements Phone {    private Phone phone = null;    public PhoneDecorate(Phone phone) {        this.phone = phone;    }    @Override    public void call() {        this.phone.call();    }}
package com.yydcdut.decorate;//裝飾者的具體類public class AfterPhone extends PhoneDecorate {    Phone phone = null;    public AfterPhone(Phone phone) {        super(phone);        this.phone = phone;    }    @Override    public void call() {        super.call();        System.out.println("打完電話。。。。");    }}
package com.yydcdut.decorate;//裝飾者的具體類public class BeforePhone extends PhoneDecorate {    Phone phone = null;    public BeforePhone(Phone phone) {        super(phone);        this.phone = phone;    }    @Override    public void call() {        System.out.println("打電話之前。。。。。");        super.call();    }}
package com.yydcdut.decorate;//測試類別,主函數public class PhoneMain {    public static void main(String[] args) {        Phone phone = new RealPhone();        phone.call();        System.out.println("-----------------------");        PhoneDecorate pd = new BeforePhone(phone);        pd.call();        System.out.println("-----------------------");        pd = new AfterPhone(phone);        pd.call();        System.out.println("-----------------------");        pd = new AfterPhone(new BeforePhone(phone));        pd.call();
    }}

總結                                                                                           

1)繼承屬於擴充形式之一,但不見得是達到彈性設計的最佳方式。

2)在設計中,應該允許行為可以被擴充,而無須修改現有的代碼。

3)組合和委託可用於在運行時動態地加上新的行為。

4)除了繼承,裝飾者模式也可以讓我們擴充行為。

5)裝飾者模式意味著一群裝飾者類,這些類用來封裝具體組件。

6)裝飾者類反映出被裝飾的組件類型(事實上,他們具有相同的類型,都經過介面或繼承實現)。

7)裝飾者可以在被裝飾者的行為前面與/或後面加上自己的行為,甚至將被裝飾者的行為整個取代掉,而達到特定的目的。

8)可以用無數個裝飾者封裝一個組件。

9)裝飾者一般對組件的客戶是透明的,除非客戶程式依賴於組件的具體類型。

10)裝飾者會導致設計中出現許多小對象,如果過度使用,會讓程式變得很複雜。

 

Java的IO流也是用了裝飾模式,BufferedInputStream/BufferedOutputStream/BufferedReader/BufferesWriter,比如:

BufferedWriter bw = new BufferedWriter(new FileWriter(“abc.txt”));

我是天王蓋地虎的分割線                                                                

原始碼:http://pan.baidu.com/s/1dD1Qx01

java模版.zip

 

轉載請註明出處:http://www.cnblogs.com/yydcdut

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.