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
C# 装饰器模式示例_C#_Design Patterns - Fatal编程技术网

C# 装饰器模式示例

C# 装饰器模式示例,c#,design-patterns,C#,Design Patterns,我浏览了Decorator设计模式,发现每一个示例都使用一个抽象Decorator类,并且还实现了要为其创建Decorator的类的接口。我的问题是, 是否需要有一个抽象的decorator类,然后定义具体的decorator 我创建了一个示例,我认为它可以类似于上述抽象类方法所实现的功能 public interface ICarModel { Int32 Price { get; } Int32 Tax { get; } } public class BaseModel

我浏览了Decorator设计模式,发现每一个示例都使用一个抽象Decorator类,并且还实现了要为其创建Decorator的类的接口。我的问题是,

  • 是否需要有一个抽象的decorator类,然后定义具体的decorator

  • 我创建了一个示例,我认为它可以类似于上述抽象类方法所实现的功能

     public interface ICarModel
     {
       Int32 Price { get; }
       Int32 Tax { get; }
     }
    
     public class BaseModel : ICarModel
     {
       public Int32 Price
       {
         get { return 50000; }
       }
    
       public Int32 Tax
       {
         get { return 5000; }
       }
    
       public String GetBaseCarDetails()
       {
         return "Base car model Price is : " + this.Price
           + " and Tax is : " + this.Tax;
       }
     }
    
     public class LuxuryModel
     {
       ICarModel _iCarModel;
    
       public LuxuryModel(ICarModel iCarModel)
       {
         _iCarModel = iCarModel;
       }
    
       public Int32 Price
       {
         get { return _iCarModel.Price + 10000; }
       }
    
       public Int32 Tax
       {
         get { return _iCarModel.Tax + 3000; }
       }
    
       public String GetLuxuryCarDetails()
       {
         return "Luxury car model Price is : " + this.Price
           + " and Tax is : " + this.Tax;
       }
     }
    
    我们可以说这是装饰图案的一个例子吗

  • 更新 我们真的需要将decorator作为抽象类吗

    我想您可以避免
    抽象
    ,但是您必须为所有类编写相同的代码。
    abstract
    的目的是避免冗余代码,并确保类符合相同的逻辑。而且它更易于维护和扩展


    Model1是一个装饰器,它将其“getPrice”逻辑的一部分委托给装饰“CarModel”

    class Model1 implements IModel
    {
        IModel m_model;
    
        Model1(CarModel model){
            m_model = model;
        }
    
        public int getPrice(){
            return m_model.getPrice() + getModelSpecificPrice();
        }
    
        protected int getModelSpecificPrice(){
            return 10;
        }
    }
    
    但是,如果有Model2、Model3等,其“getPrice”方法的逻辑是相同的呢

    在这种情况下,创建抽象装饰器是有意义的

    class AbstractModel implements IModel{
            IModel m_model;
    
            AbstractModel(CarModel model){
                m_model = model;
            }
    
            public int getPrice(){
                return m_model.getPrice() + getModelSpecificPrice();
            }
    
            abstract protected int getModelSpecificPrice();
    }
    
    
    class Model1 extends AbstractModel
    {
    
        Model1(CarModel model){
            super(model);
        }
        protected int getModelSpecificPrice(){
            return 10;
        }
    }
    

    decorator模式的目的仅仅是扩展现有类型的行为,使该类型的使用者不需要知道它如何更改的实现细节


    没有要求任何类型都是抽象的。您可以使用接口或具体类上的虚拟方法来实现这一点。

    @yannishristofakis据我所知,
    get{}
    属性是C#独有的。但不确定。你的第一个问题可能与@Kalyan重复,似乎是同一个问题,但不幸的是,我无法解释他在这里试图解释的确切含义。你能解释一下这个解释吗?@TechJay我试着在下面的回答中解释。谢谢Yanis。这可能是decorator模式中的一个实现。事实上,我的观点是我们真的需要将装饰器作为抽象类吗?@TechJay我做了解释,我希望它有意义。根据你的评论,我认为如果我们使用接口和DI,就不会有任何冗余代码。我们只需要使用接口容器传递适当的依赖项。@ Tejjayi,正如我告诉过的,这不是必要的,但它认为最好的做法是,它是一种设计模式。如果你有一个模型,那没什么大不了的。但是如果你有很多很多方法,那么实现一个抽象类就很方便了。DI代表什么?依赖注入?您的意思是我们可以使用依赖注入和接口来注入适当的基本功能并对其进行扩展?+1
    这种类型的消费者不需要知道实现细节