Re: [模式] 裝飾者模式(decorator)只有一種結構嗎?
※ 引述《worldxxi ()》之銘言:
: 今天上課講到decorator pattern,我有個疑問就是,為什麼設計上不寫成這樣
: abstract class 主餐
: {
: protect 副食品 list;
: abstract public int cost();
: }
: class 豬排 : 主餐
: {
: public override int cost()
: {
: return 130 + all list cost;
: }
: }
: ...
: abstract class 副食品
: {
: }
: class 味增湯 : 副食品
: {
: public override int cost()
: {
: return 50;
: }
: }
: ...
: 那個all list cost在哪邊做先不管,我的意思是UML繼承架構不要讓副食品繼承主餐,
: 而是讓而是用 1--------------* 把主餐與副食品連起來,我覺得這樣更加直覺,但
: 教授說這兩者完全不同,decorator有pipeline的概念; 而在我的想法中 副食品 變成
: 互為獨立,失去順序的概念,請問有沒有什麼情況一定要用decorator才能完成的case?
你這個例子叫做composite pattern
不是decorator..
當然這兩個pattern沒有互斥
兩個pattern可以一起使用
事實上我們常在寫的GUI就常常這兩個pattern混着用
+---->View<--------------------+
| * | 1 |
| ----+--------+----------| |
1| | | | |1
Container LabelView BorderView
// 這個叫做Composite
Container container = new Container();
container.add(new LabelView());
container.add(new LabelView());
// 這個叫做decorator
View borderLabel = new BorderView(new LabelView());
container.add(borderLabel);
回到你的例子,我把你的架構改成
餐點
|
+---------+--------+-----------+-------+
| | | | |
正餐 套餐 副餐 飲料 會員餐點
套餐 set = new 套餐(); //5% off for set
//這個叫composite
set.add(new 正餐());
set.add(new 副餐());
set.add(new 飲料());
//這個叫decorate
vipSet = new 會員餐點(set); //10% off for VIP
int cost = vipSet.cost();
class內部怎麼實作我就不寫了 :P
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.163.46.230
※ 編輯: popcorny 來自: 118.163.46.230 (06/24 13:23)
※ 編輯: popcorny 來自: 118.163.46.230 (06/24 13:25)
※ 編輯: popcorny 來自: 118.163.46.230 (06/24 13:26)
※ 編輯: popcorny 來自: 118.163.46.230 (06/24 13:27)
推
06/24 16:06, , 1F
06/24 16:06, 1F
推
06/24 22:53, , 2F
06/24 22:53, 2F
推
07/25 18:29, , 3F
07/25 18:29, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):
OOAD 近期熱門文章
PTT數位生活區 即時熱門文章