設計模式 裝飾模式

2021-08-23 14:26:01 字數 4146 閱讀 7048

##需求

具體應用場景有很多,比如穿衣打扮等需要各種組合的場景。這裡以食堂點餐舉例。

很多人肯定吃過食堂裡公尺飯+各種菜組合的蓋飯,菜包括宮保雞丁、魚香肉絲和番茄雞蛋等等。不同的菜有不同的**,那麼如何在程式裡得到具體點了什麼菜和最終的**呢?

第一時間想到肯定是繼承。

定義公尺飯的父類。

對於不同的菜分別繼承公尺飯這個父類,例如宮保雞丁公尺飯,魚香肉絲公尺飯等等。

對於組合的菜再分別繼承公尺飯這個父類,例如宮保雞丁魚香肉絲公尺飯,宮保雞丁番茄雞蛋公尺飯甚至點四五個菜組合的等等。

這樣雖然可以實現功能,但是我們會發現如果菜品夠多的話,我們需要組合各種菜去繼承父類公尺飯。同時,如果新增了一道菜,需要去組合其他每一道菜,增加好多龐大的子類。這時候我們可以考慮學習使用裝飾模式。

##定義

裝飾模式(decorator),動態地給乙個物件新增一些額外的功能和職責。就增加功能來說,裝飾模式比生成子類更為靈活。

component定義了乙個物件介面,可以給這些物件動態地新增一些功能。

concretecomponent是定義了乙個具體的物件,也可以給這個新增一些職責。

decorator,裝飾抽象類,繼承了component,從外類來擴充套件component功能,但對於component來說,是無需知道decorator的存在的。

concretedecorator,具體裝飾物件,起到給component新增職責的功能。

##實現

就上面點餐的場景根據uml進行設計

1.定義乙個ricecomponent)的介面

/**

* 公尺飯介面 component

* @description todo

* @classname rice

* @author lay

*/public

inte***ce

rice

2.實現乙個具體的basericeconcretecomponent)實現類,實現普通的公尺飯

/**

* 基本公尺飯類,實現公尺飯介面

* @description todo

* @classname baserice

* @author lay

* */

public

class

baserice

implements

rice

@override

public string getname()

}

3.定義公尺飯的裝飾抽象類ricedecorator,實現rice介面

/**

* 公尺飯裝飾類,繼承了rice基類

* @description todo

* @classname ricedecorator

* @author lay

*/public

abstract

class

ricedecorator

implements

rice

//將具體的行為(方法)放到子類中去實現

@override

public

abstract

intgetprice()

;@override

public

abstract string getname()

;}

4.實現具體的裝飾類gbjdricedecorator(concretedecorator),宮保雞丁裝飾類

/**

* 宮保雞丁裝飾類,繼承抽象裝飾類ricedecorator,具體去實現

* @description todo

* @classname gbjdricedecorator

* @author lay

*/public

class

gbjdricedecorator

extends

ricedecorator

/** * 核心:對功能的拓展和裝飾(對**和名稱進行累積)

*/@override

public

intgetprice()

@override

public string getname()

}

其他具體的裝飾類如下:yxrsricedecorator(魚香肉絲)

/**

* 魚香肉絲裝飾類,繼承抽象裝飾類ricedecorator,具體去實現

* @description todo

* @classname gbjdricedecorator

* @author lay

*/public

class

yxrsricedecorator

extends

ricedecorator

@override

public

intgetprice()

@override

public string getname()

}

fqjdricedecorator(番茄雞蛋)

//番茄雞蛋裝飾類

public

class

fqjdricedecorator

extends

ricedecorator

@override

public

intgetprice()

@override

public string getname()

}

5.main函式(這裡測試是點了以上全部三個菜,具體可以進行不同組合包裝)

public

class

testmain

}

6.結果

##總結

1.裝飾模式是為**已有功能動態地新增更多功能**的一種方式。

2.對於之前的繼承,當系統需要新功能的時候,是向舊的類中新增新的**。這些新加的**通常裝飾了原有類的核心職責主要行為

,這種做法的問題在於,它們在主類中加入了新的字段,新的方法和邏輯,從而增加了主類的複雜度,而這些新加入的東西僅僅是為了滿足一些只在某種特定情況下才會執行的特殊行為的需求。而裝飾模式卻提供了乙個非常好的解決方案,它把每個要裝飾的功能單獨放在單獨的類中,並讓這個類包裝它所要裝飾的物件,因此,當需要執行特殊行為時,客戶**就可以在執行時根據需要有選擇地、按順序的使用裝飾功能包裝物件了。

##優點:

1.把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。

2.有效地把類的核心職責裝飾功能**區分開了。而且可以去除相關類中重複的裝飾邏輯。

設計模式 裝飾模式

裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...

設計模式 裝飾模式

剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...

設計模式 裝飾模式

複習設計模式 裝飾模式 裝飾模式 在不修改已經存在的類的情況下,動態的新增新的功能,實現即插即用,開放關閉原則 public inte ce man public class batman implements man override public void killmonster public ...