Nav*_*K N 5 c# java design-patterns
我觉得装饰模式最让人困惑.请考虑"Head first design patterns book"中提供的示例.

因此,为了获得带有双摩卡和鞭子的DarkRoast,你必须写
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
Run Code Online (Sandbox Code Playgroud)
我觉得这是不必要的.这是我的实施,
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();
Run Code Online (Sandbox Code Playgroud)
IMO,两者都是一样的.如果是,那么在这里使用装饰模式有什么好处?
有什么想法吗?
sha*_*esh 16
不,他们不一样.
头部第一个例子有1杯饮料,摩卡,鞭子,烤肉添加.你的例子有3种饮料.
请参阅头首代码.它适用于饮料的同一个实例
beverage2 = new Mocha(beverage2);
beverage2 = new DarkRoast(beverage2);
beverage2 = new Whip(beverage2);
Run Code Online (Sandbox Code Playgroud)
您的代码创建了3种饮料(这意味着有人分别订购了3种饮料).
在现实生活中,我想这不是饮料.饮料是一种和添加在其上的味道.
装饰者的目的是 - 装饰..Net有TextWriter和IndentedTextWriter(我猜),它基本上采用你的普通文本并对其应用缩进.如果你想到它,它在某种程度上类似于unix管道.
输入 - >调整 - >调整输入 - >进一步调整 - >进一步调整输入.
当前操作的输出变为下一操作的输入.
我不知道我是否解释得很好.