1. 程式人生 > >學習設計模式——裝飾者模式

學習設計模式——裝飾者模式

在現實生活中,常常需要對現有產品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟體開發過程中,有時想用一些現存的元件。這些元件可能只是完成了一些核心功能。但在不改變其結構的情況下,可以動態地擴充套件其功能。通常情況下,擴充套件一個類的功能會使用繼承方式來實現。但繼承具有靜態特徵,耦合度高,並且隨著擴充套件功能的增多,子類會很膨脹。如果使用組合關係來建立一個包裝物件(即裝飾物件)來包裹真實物件,並在保持真實物件的類結構不變的前提下,為其提供額外的功能,這就是裝飾模式的目標。下面來分析其基本結構和實現方法。

1. 認識裝飾者模式

    1. 定義:指在不改變現有物件結構的情況下,動態地給該物件增加一些職責(即增加其額外功能)的模式,它屬於物件結構型模式。

    2. 裝飾模式的組成:裝飾模式主要包含以下角色。

 

  • 抽象構件(Component)角色:定義一個抽象介面以規範準備接收附加責任的物件。
  • 具體構件(Concrete    Component)角色:實現抽象構件,通過裝飾角色為其新增一些職責。
  • 抽象裝飾(Decorator)角色:繼承抽象構件,幷包含具體構件的例項,可以通過其子類擴充套件具體構件的功能。
  • 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,並給具體構件物件新增附加的責任。

    3. 參考程式碼:

public class DecoratorPattern
{
    public static void main(String[] args)
    {
        Component p=new ConcreteComponent();
        p.operation();
        System.out.println("---------------------------------");
        Component d=new ConcreteDecorator(p);
        d.operation();
    }
}
//抽象構件角色
interface  Component
{
    public void operation();
}
//具體構件角色
class ConcreteComponent implements Component
{
    public ConcreteComponent()
    {
        System.out.println("建立具體構件角色");       
    }   
    public void operation()
    {
        System.out.println("呼叫具體構件角色的方法operation()");           
    }
}
//抽象裝飾角色
class Decorator implements Component
{
    private Component component;   
    public Decorator(Component component)
    {
        this.component=component;
    }   
    public void operation()
    {
        component.operation();
    }
}
//具體裝飾角色
class ConcreteDecorator extends Decorator
{
    public ConcreteDecorator(Component component)
    {
        super(component);
    }   
    public void operation()
    {
        super.operation();
        addedFunction();
    }
    public void addedFunction()
    {
        System.out.println("為具體構件角色增加額外的功能addedFunction()");           
    }
}

2. 理解裝飾者模式

    1. 優缺點: 其主要缺點是裝飾模式增加了許多子類,如果過度使用會使程式變得很複雜。裝飾(Decorator)模式的主要優點有

  • 採用裝飾模式擴充套件物件的功能比採用繼承方式更加靈活。
  • 可以設計出多個不同的具體裝飾類,創造出多個不同行為的組合。

     2. 應用場景:裝飾模式通常在以下幾種情況使用。

  • 當需要給一個現有類新增附加職責,而又不能採用生成子類的方法進行擴充時。例如,該類被隱藏或者該類是終極類或者採用繼承方式會產生大量的子類。
  • 當需要通過對現有的一組基本功能進行排列組合而產生非常多的功能時,採用繼承關係很難實現,而採用裝飾模式卻很好實現。
  • 當物件的功能要求可以動態地新增,也可以再動態地撤銷時。

裝飾模式在 Java 語言中的最著名的應用莫過於 Java I/O 標準庫的設計了。例如,InputStream 的子類 FilterInputStream,OutputStream 的子類 FilterOutputStream,Reader 的子類 BufferedReader 以及 FilterReader,還有 Writer 的子類 BufferedWriter、FilterWriter 以及 PrintWriter 等,它們都是抽象裝飾類。下面程式碼是為 FileReader 增加緩衝區而採用的裝飾類 BufferedReader 的例子:    

BufferedReader in=new BufferedReader(new FileReader("filename.txtn));
String s=in.readLine();

    3. 裝飾模式與代理模式、介面卡模式的比較:三者確實非常相似,

(1)但是裝飾者模式注重於對於原本所需要使用的類的功能擴充套件;而代理模式則注重於封裝具體的實現,降低呼叫者與被呼叫者之間的耦合度;介面卡模式注重於對程式碼功能的複用

(2)介面卡模式中客戶端呼叫的介面卡方法與真正實現功能的類中的方法是不同的,而代理模式於裝飾者模式都必須實現同一個方法;

    4. 實際上,如果裝飾者模式中的具體裝飾類只有一個的話,那麼就可以將抽象裝飾類刪去,這樣一更改,實際上就是變成了代理模式。

只有一个具体装饰的装饰模式

相關推薦

設計模式學習筆記二------裝飾模式

設計原則: 少用繼承,多用組合 類應該對擴充套件開放,對修改關閉 目錄 本文的結構如下: 什麼是裝飾者模式 為什麼要用該模式 模式的結構 程式碼示例 優點和缺點 適用環境 總結 一、什麼是裝飾模式 裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝

學習、探究Java設計模式——裝飾模式

定義 裝飾者模式:在不改變原類檔案以及不使用繼承的情況下,動態地將責任附加到物件上,從而實現動態拓展一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 設計原則 要使用裝飾者模式,需要滿足以下設計原則: 1、多用組合,少用繼承

學習設計模式——裝飾模式

在現實生活中,常常需要對現有產品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟體開發過程中,有時想用一些現存的元件

Java設計模式裝飾模式

解決 over 裝飾者模式 pack img 應該 ora 我們 lan 目錄      一、問題引入  二、設計原則  三、用裝飾者模式解決問題  四、裝飾者模式的特點  五、裝飾者模式的定義  六、裝飾者模式的實現  七、java.io包內的裝飾者模式

javascript設計模式——裝飾模式

應用 提交表單 不同 ora fin input 是否為空 插件 和數 前面的話   在程序開發中,許多時候都並不希望某個類天生就非常龐大,一次性包含許多職責。那麽可以使用裝飾者模式。裝飾者模式可以動態地給某個對象添加一些額外的職責,而不會影響從這個類中派生的其他對象。本

C# - 設計模式 - 裝飾模式

private 實現類 comm 回路 匯總 abs round C# 由於 裝飾者模式 問題場景 如果要計算一杯咖啡的價格,只需要調用其獲取價格的方法就可以了,但是如果需要加一些材料,比如牛奶、巧克力、糖等等,這些材料也必須返回它們價格以便於用於匯總計算,但是材料有很

設計模式——裝飾模式

什麽 很多 方法 info 改變 劃分 llb 設計 nts - 什麽是裝飾者模型 裝飾者模型通過組合的方式擴展對象的特性,動態地給對象添加額外的職責。在增加功能上,裝飾模式比生成子類更加靈活。 - 職責劃分 Component抽象構建,是接口或者抽象類,就是定義原始對象

C#設計模式——裝飾模式

方式 實例 oid spa als note 客戶 基本功 pan 一、裝飾者模式介紹: 裝飾者模式——以對客戶透明的方式動態地給一個對象添加額外的職責,采用對象組合而非繼承的方式實現了再運行時動態地擴展對象功能的能力,相比生成子類可以更靈活地增加功能,而且可以根據需要擴展

設計模式-裝飾模式(Go語言描述)

什麼是裝飾者模式 好久沒有更新設計模式系列的部落格了, 今天我們來聊一聊裝飾者模式, 用過java的同學肯定對裝飾者模式非常熟悉,就算你不知道什麼是裝飾者模式這概念, 你也一定在程式碼中經常用到這個模式,為什麼這麼說呢? 大家都用過java中的流吧, 我們可以這樣寫: new B

android設計模式——裝飾模式

定義:允許向一個現有的物件新增新的功能,同時又不改變其結構。 使用場景:能夠動態地擴充套件類的功能 應用舉例:一個畫可以被裝在畫框裡,並且被蒙上玻璃,這時候畫,玻璃,畫框組成了一個東西。 類圖: Comppoent: 抽象元件 ConcreteComponet:元件的具體

java設計模式--裝飾模式

照例搬一篇文章連線,我一般會選擇帶有uml圖的 方便理解,我只貼程式碼,因為我覺得別人理解的比我透徹,寫的比我好 http://www.cnblogs.com/stonefeng/p/5679638.html 裝飾者模式可以給物件新增一些額外的東西,設計模式那種書中舉例是星巴克的例子,如果每一種做

設計模式-裝飾模式(Decorator)

概述 定義 : 在不改變原有物件的基礎之上, 將功能附加到物件上 提供了比繼承更有彈性的替代方案(擴充套件原有物件功能) 又叫包裝器Wrapper, 介面卡模式也被稱之為包裝器 型別 : 結構型 適用場景 擴充套件一個類的功能或給一個類

Java設計模式-裝飾模式

定義: 裝飾者是在不改變物件的情況下動態給物件新增屬性和行為,將責任動態的附加在物件上。 與繼承有類似功能即擴充套件功能。 裝飾者模式與繼承的區別: **繼承:**在子類擴充套件功能的時候是靜態的,並且是已知需要擴充套件的功能,是在編譯時實現的。 **裝飾者模式:**比繼承更

從原始碼角度理解Java設計模式——裝飾模式

一、飾器者模式介紹 裝飾者模式定義:在不改變原有物件的基礎上附加功能,相比生成子類更靈活。 適用場景:動態的給一個物件新增或者撤銷功能。 優點:可以不改變原有物件的情況下動態擴充套件功能,可以使擴充套件的多個功能按想要的順序執行,以實現不同效果。 缺點:更多的類,使程式複雜 型別:結構型。 類圖

設計模式--結構型模式--裝飾模式

//Structural Patterns--Decorator //結構型模式--裝飾者模式 //Component(抽象構件):給出一個抽象介面,以規範準備接收附加責任的物件。 //ConcreteComponent(具體構件):定義一個將要接收附加責任的類。 //De

Header First設計模式——裝飾模式

       我曾經以為應該用繼承處理一切。後來領教到執行時擴充套件,遠比編譯時期的繼承威力大。本章可以稱為“給愛用繼承的人一個全新的設計眼界”。我們即將再度探討典型的繼承濫用問題。在本章將會學到如何使用物件組合的方式,做到在執行時裝飾類。一旦你熟悉了裝飾的技巧,你將能在不修

C++設計模式--裝飾模式

裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。                                                                                          

Java設計模式---裝飾模式(用生活例子解釋通過裝飾類物件對方法進行實現介面的方法增強)

裝飾者模式可以動態地給一個物件新增一些額外的職責。 就增加功能來說,Decorator模式相比生成子類更為靈活。 該模式的適用環境為: (1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。 (2)處理那些可以撤消的職責。 (3)當不能採用生成子

C#設計模式-裝飾模式

using System; using System.Collections.Generic; namespace TestCS { class Program { static void Main(string[] args) {

javascript設計模式-裝飾模式(9)

裝飾者是一種為物件新增新特性的技術,它並不適用建立新子類的這種手段。裝飾者模式可以用來透明的把物件包裝在具有同樣介面的另一個物件之中。這樣我們就可以為物件新增一個方法或者一些行為,然後將方法呼叫傳