Re: [模式] 裝飾者模式(decorator)只有一種結構嗎?

看板OOAD作者 (畢業了..@@")時間11年前 (2013/06/24 13:10), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串5/5 (看更多)
※ 引述《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
文章代碼(AID): #1HnzJ0lU (OOAD)
文章代碼(AID): #1HnzJ0lU (OOAD)