Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 没有具体对象的装饰设计模式_Design Patterns_Decorator - Fatal编程技术网

Design patterns 没有具体对象的装饰设计模式

Design patterns 没有具体对象的装饰设计模式,design-patterns,decorator,Design Patterns,Decorator,我看到了Decorator DP示例,但它们都暗示,具体对象将位于链的末端: IProduct prod2=新糖(新糖(新糖)(新牛奶(新暗室))); WriteLine(“我是{0},我的成本是{1}”,prod2.Name(),prod2.cost()); 暗室是一个具体的对象,另一个对象是一个装饰器。所以,我(或客户)需要记住谁是创造链的和 因此,默认情况下,我不能: IProduct prod2=新糖(新暗室糖)(新糖(新牛奶)(新糖())); WriteLine(“我是{0},我的成

我看到了Decorator DP示例,但它们都暗示,具体对象将位于链的末端:

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谢谢,我认为可能需要这样做,但我并不真正了解语言,没有这样做。我现在就改。我认为这完全合理。嗯。这取决于用法。最后一篇文章建议购物?在这种情况下,这不是一个好的解决办法。这取决于用法。最后一篇文章建议购物?在这种情况下,这不是一个好的解决方案