首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰图案的替代方案

装饰图案的替代方案
EN

Stack Overflow用户
提问于 2009-08-08 18:01:39
回答 3查看 4.4K关注 0票数 6

我觉得装饰图案最让人困惑。请考虑在“头第一设计模式书”中提供的例子。

因此,要获得一个带有双摩卡和鞭子的DarkRoast,您必须编写

代码语言:javascript
复制
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);                                       
beverage2 = new Mocha(beverage2);                                       
beverage2 = new Whip(beverage2); 

我觉得这是不必要的。这是我的实现,

代码语言:javascript
复制
interface Beverage
{
   int Cost();
}

class DarkRoast : Beverage
{
   /* .... */
}

class Mocha : Beverage
{
   /* .... */
}

class Whip : Beverage
{
   /* .... */
}

// here is the changed part
class Order
{
    List<Beverage> beverages = new List<Beverage> beverages();
    public void AddItem(Beverage b)
    {
        beverages.Add(b);
    }

    public int Cost()
    {
        int cost;
        foreach(Beverage b in beverages)
            cost += b.Cost();
    }
}

// use it like
Order order = new Order();
order.AddItem(new DarkRoast());
order.AddItem(new Mocha());
order.AddItem(new Mocha());
order.AddItem(new Whip());
int cost = order.Cost();

海事组织,两人都是一样的。如果是,这里使用装饰图案的好处是什么?

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-08 18:06:18

不,他们不一样。

头第一例有1杯与摩卡,惠普,烘焙补充。你的例子有3种饮料。

先看这个头代码。它适用于饮料的相同实例。

代码语言:javascript
复制
beverage2 = new Mocha(beverage2);                                       
beverage2 = new DarkRoast(beverage2);                                       
beverage2 = new Whip(beverage2);

您的代码创建了3种饮料(这意味着有人分别订购了3种饮料)。

我想,在现实生活中,这不是饮料。这种饮料是加在上面的一种口味。

装潢师的目的是--装饰。.Net有TextWriter和IndentedTextWriter (我猜),它基本上采用了您的普通文本,并将缩进应用于其中。它在某种程度上类似于unix管道,如果您想到它的话。

输入->调整->调整输入->进一步调整->进一步调整输入。

当前操作的输出成为下一次操作的输入。

我不知道我是否解释得很好。

票数 15
EN

Stack Overflow用户

发布于 2009-08-08 18:11:13

Decorator模式的全部目的是通过对象组合而不是继承来添加责任。继承是静态的,obj。构图是动态的,更灵活。装饰的可能性是无限的。还可以在运行时取消对对象的装饰。

票数 10
EN

Stack Overflow用户

发布于 2009-08-08 18:12:27

我认为你实际上代表的是完全不同的东西。

在您的示例中,您有一个接收饮料的对象调用顺序,而在第一个示例中,它们只是在用配料装饰饮料,这将导致以下主要问题。

在您的订单代码中,您可以放置多个饮料,如果是这样的话,您可以放置多个加注,每种饮料配上什么配料?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1249506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档