c# - 装饰者模式的替代品

标签 c# java design-patterns

我发现装饰器模式最令人困惑。请考虑“Head first design patterns book”中提供的示例。

alt text

所以要得到一个带有双倍摩卡和鞭子的DarkRoast,你必须写

Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);                                       
beverage2 = new Mocha(beverage2);                                       
beverage2 = new Whip(beverage2); 

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

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();

IMO,两者都一样。如果是的话,这里使用装饰器模式有什么好处?

有什么想法吗?

最佳答案

不,它们不一样。

Head First 示例有 1 杯饮料,其中添加了摩卡、搅打和烤肉。您的示例有 3 种饮料。
请参阅此 Head First 代码。它适用于饮料的同一实例

beverage2 = new Mocha(beverage2);                                       
beverage2 = new DarkRoast(beverage2);                                       
beverage2 = new Whip(beverage2);

您的代码创建了 3 种饮料(这意味着有人分别订购了 3 样东西)。
我想在现实生活中,它不是饮料。饮料是一种添加在其上的口味。

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

输入 -> 调整 -> 调整输入 -> 进一步调整 -> 进一步调整输入。
当前操作的输出成为下一个操作的输入。

不知道我解释的对不对

关于c# - 装饰者模式的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1249506/

相关文章:

java - token 无效 - 无效 token : Cannot parse referred token string: Invalid gaia_data. Base64 token 上的 AuthSubToken 原型(prototype)

java - XLIFF、版本控制或翻译更新过程(Diff Leverage 步骤)

c# - 查看模型和依赖注入(inject)

design-patterns - 异步图片上传模式

c# - 在 C# 中编码 XML

javascript - 无法在支付网关的通用应用程序的 Web View 中运行 JavaScript 警报

java - 我们什么时候应该创建自己的 Java 异常类?

oop - 业务规则分为两类

c# - Silverlight:TextBlock 没有模板属性?

c# - 如何在 UI、BLL、DAL 之间使用 DTO