設計模式篇章四 裝飾模式

2021-09-29 21:46:29 字數 2952 閱讀 2699

前言:初學設計模式如果有錯誤請多多指教(thanks >-

裝飾模式又稱為裝飾者模式,是結構型模式中的一種,指的允許向乙個現有的類新增新的功能,而又不改變其結構。(就好比對乙個物件進行裝飾新增一些東西但又不改變該物件本身的結構)

參與角色

功能抽象的被裝飾類角色

作為被裝飾類和裝飾類之間的介面

具體被裝飾角色

實現了被裝飾類

抽象的裝飾類角色

持有乙個抽象的被裝飾類角色(實現了抽象的被裝飾類角色)

具體的裝飾類角色

實現了具體裝飾,負責給被裝飾物件進行裝飾(繼承了抽象的的裝飾類角色)

接著篇章三的案例,小明現在選擇使用保溫杯,然後小明決定在網上購買保溫杯,小明看到一家賣保溫杯的點,裡面可以自選保溫杯的顏色(可供自選的顏色有藍色、黑色和藍黑色),現在我們使用裝飾模式來實現這個案例。模組設計:設計抽象的被裝飾類角色(杯子抽象類)、設計具體被裝飾角色(將杯子類進行實現)、設計抽象的裝飾類角色(將杯子的顏色進行抽象)和設計具體的裝飾類角色(保溫杯可選的顏色)

(1)設計乙個抽象的被裝飾類角色(cup類)

/**

* * @introduction 該類是抽象的被裝飾的角色,是乙個抽象類

* */

public

abstract

class

cup

(2)設計乙個具體的被裝飾類角色(realcup類)

/**

* @introduction 該類實現了cup類,是被裝飾的具體物件

*/public

class

realcup

extends

cup}

(3)設計乙個抽象裝飾類角色(decoratecup類)

/**

* @introduction 該類實現了cup,以及在內部定義了乙個cup類的引用

*/public

abstract

class

decoratecup

extends

cup

(4)設計乙個具體裝飾類角色(bluecup類)

/**

* @introduction 該類是乙個具體的裝飾類,實現了抽象的裝飾角色,在該類在構造時就必須傳入被裝飾的物件(裝飾角色單獨存在無意義)

*/public

class

bluecup

extends

decoratecup

/**重寫了買杯子的方法(這裡畫上重點——在重寫的方法中,呼叫傳入的被裝飾物件的buycup方法然後加上該具體裝飾類的特有屬性)*/

@override

public

void

buycup()

}

(5)設計乙個具體裝飾類角色(blackcup類)

/**

* @introduction 該類是乙個具體裝飾角色,表明小明買的杯子顏色是黑色,實現了抽象的裝飾類角色

*/public

class

blackcup

extends

decoratecup

/**重寫了cup類中的買杯子方法(同樣這裡畫重點)*/

public

void

buycup()

}

(6)模擬使用者介面**

/**

* @introduction 該類模擬使用者介面

*/public

class

main

}

首先我們考慮不使用設計模式來實現該功能,面對這樣乙個功能實現我們可以首先設計乙個抽象的杯子類,該類是所有可選顏色杯子類的抽象,然後設計所有的可選杯子的類,並讓所有可選杯子類繼承杯子的抽象類,在該題中我們需要設計3個具體的杯子類,分別是藍色杯子類、黑色杯子類和藍黑色杯子類,然後我們在使用者介面在例項化這些具體杯子類來達到使用者選擇杯子的要求,現在我們來分析一下這種做法的優劣:

優點:開放—封閉原則比較好,該類程式可拓展性比較好(比如要加乙個新型別的杯子,直接設計乙個相關類繼承杯子類即可)

缺點:**不夠靈活,每次我們需要推出乙個新的杯子型別都要設計乙個新的類;廣泛的使用繼承,提高了程式的耦合性,如果設計到對抽象杯類的修改,則可能會造成不好影響;**復用性不高。

下面我們來分析一下使用裝飾模式,在裝飾模式中我們一共有四種角色,對於被裝飾類(包括抽象的和具體的)他們無需知道誰會裝飾他們,他們只需要實現自己的功能即可;對於裝飾類(包括抽象的和具體的),它們同樣無需知道他們裝飾的物件是誰(裝飾物件的決定在使用者介面實現),每乙個裝飾類只需要完成好自己裝飾的功能。裝飾模式的優劣分析(重點):

優點:(1)程式擁有良好的靈活性,由於裝飾可以隨意搭配和組合,不同的裝飾相互搭配會有不同的結果。

(2)可拓展性比較好,就上例來說若商家需要增加粉色的杯子,我們只需要在裝飾類中增加乙個新類就好。

(3)復用性比較強,如果我們還有乙個玻璃杯類上架(前面是保溫杯類),我們只需要然玻璃杯類繼承抽象杯類,然後就可以在使用者介面使用裝飾類來裝飾玻璃杯。

缺點:(1)由於程式靈活性的特點,這意味著程式的複雜性會大大增加(如果出現錯誤,由於各個類之間層層裝飾找錯誤比較麻煩——這就是有得必有失吧)

(2)由於裝飾類都在使用者介面和介面邏輯一起實現,所以會導致使用者介面過於雜亂同時會暴露相關類的資訊。(可以考慮使用使用半透明或者透明的裝飾類——將裝飾過程進行包裝封閉)

(3)由於各種裝飾類相互裝飾,可能會導致**難以理解,過度使用的話會使程式變得很複雜。

設計模式(四) 裝飾模式

裝飾模式又被稱為包裝模式。通過對客戶端透明的方式來拓展物件的功能,是繼承關係的一種替代方案 假設,現在要給qq秀裡的人物設計裝扮衣服,每個人可按自己不同的喜好搭配不同的衣服。先建立person類,它裡面有乙個show 展示 也是穿衣服 的方法 public class person public p...

設計模式筆記(四) 裝飾模式

裝飾模式 decorator 裝飾模式是為已有功能動態的新增更多功能的一種方式。using system namespace studesignmode.decorator public abscustomer public abscustomer string name public virtua...

設計模式系列(四) 裝飾模式

動態的為乙個物件的某些職責新增一些額外的功能,與通過繼承來獲得新功能相比,decorator 更加的靈活 試想一下,如果沒有 decorator,轉而使用繼承,每當想要為乙個物件新增某個功能時,我們就需要生成乙個子類。當需要這些功能的組合時,就要生成更多的具有組合功能的子類。這會產生兩個問題 1.類...