23種設計模式 裝飾者設計模式

2021-08-15 03:48:41 字數 3313 閱讀 7769

23種設計模式之一,英文叫decorator pattern,又叫包裝模式。裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。

裝飾物件和真實物件有相同的介面。

裝飾物件包含乙個真實物件的引用。

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

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

模擬冰淇淋店訂單系統的案例:

冰淇淋種類:milkcream、chocolatecream、strawberrycream、mixcream

配料種類:candy、fruit、jam

一、利用oop思想設計方案:1. 為所用冰淇淋類抽象出乙個父類:icecream,類中有私有成員變數description與getdescription()方法,抽象方法cost(),分別作為獲取冰淇淋描述與**的方法。

2. 所有冰淇淋類繼承icecream,分別定義其description與cost()方法。

3. 繼續定義配料與冰淇淋組合的類:milkcream&&candymilkcream&&fruitmilkcream&&candy&&fruit….重新定義冰淇淋描述與**的方法。

總結:設計到這裡發現問題,若只需冰淇淋單品類的話可以接受,一旦配合配料一起設計類,發現需要建立的類too many…進而利用裝設者模式改進此問題。

二、改進設計方案:

為所用冰淇淋類抽象出乙個父類:icecream,類中有私有成員變數description,與私有成員變數candy、fruit、jam,描述配料的資訊。

有成員方法cost()與私有成員變數的set(),get()方法,在getdescription()中判斷candy、fruit、jam的狀態

所有冰淇淋類繼承icecream

總結:此種方案可以通過判斷candy、fruit、jam的狀態來獲取是否加入該配料的資訊,例如-1代表未條件該配料,正數代表新增了幾分,解決了上個方案類**的問題,但仍存在隱患,例如新加入一種配料的話,需要在已經設計好的類中繼續修改程式,違反了程式設計中的開放-關閉原則,仍不理想。

三、利用裝飾者設計模式設計方案:

設計所有類的超類ice:

/*

* 所有類的超類,冰淇淋類配料類均繼承此類

*/public

abstract

class ice

public

void

setdescription(string description)

public

double

getprice()

public

void

setprice(double price)

public

abstract

double

cost();

}

2.由於所有冰淇淋類中的cost()方法均為返回此**,進而繼續為所有冰淇淋類再次抽象出乙個父類icecream

public

class

icecream

extends

ice

}

3.建立各個冰淇淋類

/*

* 牛奶冰淇淋!

*/public

class

milkcream

extends

icecream }/*

* 巧克力冰淇淋!

*/public

class

chocolatecream

extends

icecream }/*

* 士多啤梨冰淇淋!

*/public

class

strawberrycream

extends

icecream }/*

* 什錦冰淇淋

*/public

class

mixcream

extends

icecream

}

4.建立乙個配料類seasoning

public

class

seasoning

extends

ice ;

@override

public

double

cost()

@override

public string getdescription()

}

5.建立各個配料類

/*

* 配料:糖果

*/public

class

candy

extends

seasoning }/*

* 配料:水果粒

*/public

class

fruit

extends

seasoning }/*

* 配料:果醬

*/public

class

jamextends

seasoning

}

6.建立測試類iceshop,模擬訂單系統

/*

* 冰淇淋商店類

*/public

class iceshop

}

7.結果

8.圖形模擬

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

使用不同的具體類與裝飾類的排列組合,可以在不改變原有的基礎上創造出很多不同行為的組合。

對比繼承而言,**更複雜。

1.某個已有的物件新增新功能時

2.設計某個狀態經常需要改動的物件時

23種設計模式之裝飾者模式

今天我來向大家講解一下裝飾者模式,裝飾者模式的設計原則同樣也是對擴充套件開放,對修改關閉,那我們就有了乙個問題,如何做到對修改關閉,對擴充套件開放呢?我們都知道,裝飾者模式的定義是動態地將責任附加到物件中,其實裝飾者模式也可以說是動態巢狀的乙個過程。就比如舉例來說,假如我現在到乙個商店中買了一杯牛奶...

23種設計模式之裝飾模式

職責 動態的為乙個物件增加乙個新的功能 裝飾模式是乙個用於代替繼承的技術,無須通過繼承增加子類就能擴充套件物件的新功能,使用物件的關聯關係代替繼承關係,更加靈活,同時避免型別體系的快速膨脹。component抽象控制項元件 concretecomponent具體構件角色 真實物件 decorator...

23種設計模式 裝飾器模式

7.應用場景 8.現實案例 9.注意事項 某些情況,當乙個類已經存在,並且可以對外提供核心功能時,但是,某個時刻,希望對這個類進行功能增強 如 增加快取 通常情況,我們可以修改原來的類,並增加對應的增強功能即可 但是,這種方式違背了 開 閉 原則,需要修改原來的 而且不夠靈活,如果有某個時刻又不想使...