首先,这种分配是不合法的:
Coffee coffee = new Mocha(new Coffee());
一个Mocha
不是Coffee
也没有从Mocha
到Coffee
隐式转换。要“移除”装饰器,您需要提供一个方法或一个强制转换来执行此操作。所以,你可以添加一个去除装饰方法Mocha
:
public Coffee Undecorate() {
return (Coffee)decoratedItem;
}
然后,你可以说
Coffee coffee = new Mocha(new Coffee()).Undecorate();
或者,您可以提供在Mocha
类隐式转换操作符:
public static implicit operator Coffee(Mocha m) {
return (Coffee)m.decoratedItem;
}
然后你的线路
Coffee coffee = new Mocha(new Coffee());
将是合法的。
现在,您的问题暗示了对设计模式的潜在误解(实际上,您的实现也暗示了一种误解)。你想做的事很臭。使用装饰器模式的正确方法就是这样。请注意,CoffeeDecorator
派生自Coffee
!
abstract class Item { public abstract decimal Cost(); }
class Coffee : Item { public override decimal Cost() { return 1.99m; } }
abstract class CoffeeDecorator : Coffee {
protected Coffee _coffee;
public CoffeeDecorator(Coffee coffee) { this._coffee = coffee; }
}
class Mocha : CoffeeDecorator {
public Mocha(Coffee coffee) : base(coffee) { }
public override decimal Cost() { return _coffee.Cost() + 2.79m; }
}
class CoffeeWithSugar : CoffeeDecorator {
public CoffeeWithSugar(Coffee coffee) : base(coffee) { }
public override decimal Cost() { return _coffee.Cost() + 0.50m; }
}
然后你就可以说:
Coffee coffee = new Mocha(new CoffeeWithSugar(new Coffee()));
Console.WriteLine(coffee.Cost()); // output: 5.28
鉴于此,你有什么需要去除装饰它?
对不起让我修复 – mikedev 2010-01-30 02:50:33
我应该澄清 - 我想删除只有一个装饰器,例如,如果我有3个不同的装饰器,我想最终只有2.你的解决方案看起来像它是删除所有装饰器。 – mikedev 2010-01-30 02:53:40
假定你有'DecoratedCoffee咖啡=新的Mocha(新的CoffeeWithSugar(新的Coffee()));'并且你有一个方法'DecoratedCoffee.Undecorate'。 “DecoratedCoffee.Undecorate”的返回类型应该是什么?如果它是'DecoratedCoffee',那么'新的CoffeeWithSugar(新的Coffee())的结果是什么?Undecorate()'?它应该是'Coffee'的新实例,但它不能是因为它的返回类型是'DecoratedCoffee'; 'DecoratedCoffee'作为返回类型是荒谬的。所以,它应该是'咖啡',但后来'新的摩卡咖啡(新的CoffeeWithSugar(新咖啡()))。未装饰()。未装饰()'不可能不铸造。 – jason 2010-01-30 03:11:37