Design patterns 没有具体对象的装饰设计模式
我看到了Decorator DP示例,但它们都暗示,具体对象将位于链的末端:Design patterns 没有具体对象的装饰设计模式,design-patterns,decorator,Design Patterns,Decorator,我看到了Decorator DP示例,但它们都暗示,具体对象将位于链的末端: IProduct prod2=新糖(新糖(新糖)(新牛奶(新暗室))); WriteLine(“我是{0},我的成本是{1}”,prod2.Name(),prod2.cost()); 暗室是一个具体的对象,另一个对象是一个装饰器。所以,我(或客户)需要记住谁是创造链的和 因此,默认情况下,我不能: IProduct prod2=新糖(新暗室糖)(新糖(新牛奶)(新糖())); WriteLine(“我是{0},我的成
IProduct prod2=新糖(新糖(新糖)(新牛奶(新暗室)));
WriteLine(“我是{0},我的成本是{1}”,prod2.Name(),prod2.cost());
暗室是一个具体的对象,另一个对象是一个装饰器。所以,我(或客户)需要记住谁是创造链的和
因此,默认情况下,我不能:
IProduct prod2=新糖(新暗室糖)(新糖(新牛奶)(新糖()));
WriteLine(“我是{0},我的成本是{1}”,prod2.Name(),prod2.cost());
但是,意思(我认为)是一样的:黑烤咖啡+3糖+1牛奶
因此,我将其重新设计为:
公共接口IPProduct{
双重成本();
字符串名();
}
公共类暗室:IPProduct{
IPProduct_产品;
公共暗室(IPproduct prod=null){u product=prod;}
公共双重成本(){
如果(_product!=null){返回2.5+_product.Cost();}
else{return 2.5;}
}
公共字符串名称(){
如果(_product!=null){返回“暗室”+_product.Name();}
else{返回“暗室”;}
}
}
公共级牛奶:IPProduct{
IPProduct_产品;
公共牛奶(ipproduct prod=null){u product=prod;}
公共双重成本(){
如果(_product!=null){返回0.5+_product.Cost();}
else{return 0.5;}
}
公共字符串名称(){
如果(_product!=null){return“With milk”+_product.Name();}
否则{返回“带奶”;}
}
}
公共级糖:IPProduct{
IPProduct_产品;
公共糖(ipproduct prod=null){u product=prod;}
公共双重成本(){
如果(_product!=null){返回0.2+_product.Cost();}
else{return 0.2;}
}
公共字符串名称(){
如果(_product!=null){return“With sugar”+_product.Name();}
否则{返回“带糖”;}
}
}
这使我有可能做到
IProduct prod2=新糖(新暗室糖)(新糖(新牛奶)(新糖()));
WriteLine(“我是{0},我的成本是{1}”,prod2.Name(),prod2.cost());
所以,我不需要记住东西的顺序。
而且,我认为这里所有的东西都是装饰师(这是个坏主意吗?)
这些实现的缺点是什么?这在我看来是合理的,但通过添加一个用作默认委托对象的具体对象,从而避免空检查,可能会稍微有所改进 根据我对您的语言语法的了解(这是一种我实际上不使用的语言),这看起来像这样:
public class Empty : IProduct
{
public double Cost()
{
return 0.0;
}
public string Name()
{
return "";
}
}
public class Sugar : IProduct
{
IProduct _product;
public Sugar(IProduct prod = null)
{
_product = (prod == null) ? new Empty() : prod;
}
public double Cost()
{
return 0.2 + _product.Cost();
}
public string Name()
{
return "With sugar " + _product.Name();
}
}
这在我看来是合理的,但通过添加一个用作默认委托对象的具体对象,从而避免空检查,可能会稍微有所改进 根据我对您的语言语法的了解(这是一种我实际上不使用的语言),这看起来像这样:
public class Empty : IProduct
{
public double Cost()
{
return 0.0;
}
public string Name()
{
return "";
}
}
public class Sugar : IProduct
{
IProduct _product;
public Sugar(IProduct prod = null)
{
_product = (prod == null) ? new Empty() : prod;
}
public double Cost()
{
return 0.2 + _product.Cost();
}
public string Name()
{
return "With sugar " + _product.Name();
}
}
一个小修正:你不能做:ipproduct prod=new Empty()你需要做:public DarkRoast(ipproduct prod=null){{u product=(prod==null)?new Empty():prod;}@zzfima谢谢,我想可能需要这样做,但我并不真正了解语言,没有这样做。我现在就改变它。我认为它是完全合理的。一个小小的修正:你不能做:ipproduct prod=new Empty(),你需要做:public DarkRoast(ipproduct prod=null){{u product=(prod==null)}new Empty():prod;}@zzfima谢谢,我认为可能需要这样做,但我并不真正了解语言,没有这样做。我现在就改。我认为这完全合理。嗯。这取决于用法。最后一篇文章建议购物?在这种情况下,这不是一个好的解决办法。这取决于用法。最后一篇文章建议购物?在这种情况下,这不是一个好的解决方案