設計模式之裝飾者模式

2021-07-11 14:01:14 字數 2063 閱讀 9711

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

(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動。

(2) 裝飾物件包含乙個真實物件的引用(reference)

(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求**給真實的物件。

(4) 裝飾物件可以在**這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在物件導向的設計中,通常是通過繼承來實現對給定類的功能擴充套件。

優點:

1. decorator模式與繼承關係的目的都是要擴充套件物件的功能,但是decorator可以提供比繼承更多的靈活性。

2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組

缺點:

1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。

2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。

3. 裝飾模式是針對抽象元件(component)型別程式設計。但是,如果你要針對具體元件程式設計時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變component介面,增加新的公開的行為,實現「半透明」的裝飾者模式。在實際專案中要做出最佳選擇。

1. 多用組合,少用繼承。

利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件。

2. 類應設計的對擴充套件開放,對修改關閉。

public class decoratormode

public person(string name)

public abstract void show();

}//boy

public class boy extends person

public void show()

}//girl

public class girl extends person

public void show()

}//abstract decorator

public abstract class finery extends person

public abstract void show();

}//concrete decoratora of boy

public class tshirt extends finery

}//concrete decoratorb of boy

public class jeans extends finery

}//concrete decoratorb of girl

public class skirt extends finery

}//concrete decoratorb of girl

public class hat extends finery

}//concrete decoratorc of girl

public class highheeledshoes extends finery

}//test case

public static void main(string args)

}

1.關於新職責:介面卡也可以在轉換時增加新的職責,但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責的。

2.關於原介面:介面卡模式是用新介面來呼叫原介面,原介面對新系統是不可見或者說不可用的。裝飾者模式原封不動的使用原介面,系統對裝飾的物件也通過原介面來完成使用。(增加新介面的裝飾者模式可以認為是其變種--「半透明」裝飾者)

3.關於其包裹的物件:介面卡是知道被適配者的詳細情況的(就是那個類或那個介面)。裝飾者只知道其介面是什麼,至於其具體型別(是基類還是其他派生類)只有在執行期間才知道

設計模式之 裝飾者模式

一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...

設計模式之裝飾者模式

此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...

設計模式之裝飾者模式

public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...