首頁>Club>
6
回覆列表
  • 1 # 五星村小黃

    你好,我是小黃,這個題目我來回答下。

    我講個故事你聽,我用的第一個手機是諾基亞,直板的,對,就是這樣的:

    那時候很流行彩鈴,我很羨慕同學的彩鈴,各種各樣的,很好聽。也很羨慕他們可以用手機聽音樂。而我的手機,只能打電話。哈哈這個手機陪伴了我好幾年。

    ok,故事講完了,很可惜那時候我還沒有學設計模式,更不知道有個裝飾模式,不然我可以自己裝飾下。來來來,我們說回正題。

    裝飾模式 (Decorator Pattern)是23種設計模式之一,

    它在不改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是透過建立一個包裝物件,也就是裝飾來包裹真實的物件。

    或者說,裝飾模式就是使用被裝飾類的一個子類的例項,在客戶端將這個子類的例項交給裝飾類, 其實是繼承的替代方案。

    在裝飾模式中的各個角色有:

    1, 抽象構件(Component)角色:給出一個抽象介面,以規範準備接收附加責任的物件。

    2, 具體構件(Concrete Component)角色:定義一個將要接收附加責任的類。 

    3, 裝飾(Decorator)角色:持有一個構件(Component)物件的例項,並實現一個與抽象構件介面一致的介面。 

    4, 具體裝飾(Concrete Decorator)角色:負責給構件物件新增上附加的責任。

    我們一起來裝飾下我的諾基亞手機吧,來看看程式碼

    我的諾基亞:

    來個裝飾器:

    裝飾點彩鈴:

    裝飾點音樂:

    最後來點測試:

    到這裡了,我們就很容易發現裝飾模式的優缺點:

      優點:使用裝飾模式,可以提供比繼承更靈活的擴充套件物件的功能,它可以動態的新增物件的功能,並且可以隨意的組合這些功能。

      缺點:正因為可以隨意組合,所以就可能出現一些不合理的邏輯

      

    其實裝飾器模式我們也有意無意中使用過,比如在Java IO類中,FileReader,BufferedReader等。以下就是:

    InputStream is = System.in; // 位元組流

    InputStreamReader isr = new InputStreamReader(is); // 裝飾成字元流

    BufferedReader br = new BufferedReader(isr); // 裝飾成字串

    另外我們經常使用的ArrayList的底層實現機制,也是利用了裝飾器模式。

    以上請參考。

  • 中秋節和大豐收的關聯?
  • 亞索雙風到底怎麼做?