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

【推薦】2019 Java 開發者跳槽指南.pdf(吐血整理) >>> hot3.png

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

1. 認識裝飾者模式

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

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

 

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

567584bf0261559b33ea7989506f2edd0e1.jpg

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

åªæä¸ä¸ªå·ä½è£é¥°çè£é¥°æ¨¡å¼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章