23種設計模式之一,英文叫decorator pattern,又叫包裝模式。裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。
裝飾物件和真實物件有相同的介面。
裝飾物件包含乙個真實物件的引用。
裝飾物件接受所有來自客戶端的請求。它把這些請求**給真實的物件
裝飾物件可以在**這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在物件導向的設計中,通常是通過繼承來實現對給定類的功能擴充套件。
模擬冰淇淋店訂單系統的案例:
冰淇淋種類:milkcream、chocolatecream、strawberrycream、mixcream
配料種類:candy、fruit、jam
一、利用oop思想設計方案:1. 為所用冰淇淋類抽象出乙個父類:icecream,類中有私有成員變數description與getdescription()方法,抽象方法cost(),分別作為獲取冰淇淋描述與**的方法。
2. 所有冰淇淋類繼承icecream,分別定義其description與cost()方法。
3. 繼續定義配料與冰淇淋組合的類:milkcream&&candy、milkcream&&fruit、milkcream&&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.注意事項 某些情況,當乙個類已經存在,並且可以對外提供核心功能時,但是,某個時刻,希望對這個類進行功能增強 如 增加快取 通常情況,我們可以修改原來的類,並增加對應的增強功能即可 但是,這種方式違背了 開 閉 原則,需要修改原來的 而且不夠靈活,如果有某個時刻又不想使...