作者popcorny (毕业了..@@")
看板OOAD
标题Re: [模式] 装饰者模式(decorator)只有一种结构吗?
时间Mon Jun 24 13:10:22 2013
※ 引述《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)
1F:推 H45 :四个月来第一篇文章给推 06/24 16:06
2F:推 tails32100 :只能给推了 06/24 22:53
3F:推 GhostTW :推 07/25 18:29