我想知道如何向消费者可用的装饰器链添加状态。鉴于这个简化模型:
abstract class AbstractPizza
{
public abstract print(...);
}
class Pizza : AbstractPizza
{
public int Size { get; set; }
public print(...);
}
abstract class AbstractPizzaDecorator
{
public Pizza:AbstractPizza;
public abstract print();
}
class HotPizzaDecorator : AbstractPizzaDecorator
{
public int Hotness { get; set; }
public print(...);
}
class CheesyPizzaDecorator : AbstractPizzaDecorator
{
public string Cheese { get; set; }
public print(...);
}
void Main()
{
BigPizza = new Pizza();
BigPizza.Size = 36;
HotBigPizza = new HotPizzaDecorator();
HotBigPizza.Pizza = BigPizza;
HotBigPizza.Hotness = 3;
HotBigCheesyPizza = new CheesyPizzaDecorator();
HotBigCheesyPizza.Pizza = HotBigPizza;
HotBigCheesyPizza.Cheese = "Blue";
HotBigCheesyPizza.print();
HotBigCheesyPizza.size = 28; // ERRRRRR !
}
现在,如果它们都实现 print 方法并通过链传播该方法,那么一切都很好。但这对国家来说如何运作呢?我无法访问 HotBigCheesyPizza 上的大小属性。
我缺少什么部分?图案错误?
感谢您的帮助!
干杯
装饰器模式用于向被装饰类添加额外的行为,而无需客户端进行调整。因此,它并不是为了添加新接口(例如hotness
, cheese
)到被装饰的东西。
一个不太好的例子是你想改变它的用途size
计算得出:您可以创建一个MetricSizePizzaDecorator
将尺寸与英制/公制单位相互转换。客户不会知道披萨已经装饰过——它只是调用getSize()
并对结果执行任何需要执行的操作(例如,计算价格)。
我可能不会在我的示例中使用装饰器,但要点是:它不会改变界面。事实上,几乎所有的设计模式都可以归结为这一点——在不改变界面的情况下增加设计的可变性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)