【问题标题】:Decorator Pattern装饰图案
【发布时间】:2013-11-02 12:18:37
【问题描述】:

我有一个装饰器模式的实现,现在我想写一个方法“添加装饰”,拥有这个方法 ICar 或 Car 的最佳类/接口是哪个?以及如何将基本车指向新装饰车?

使用示例:

ICar car=new Car();
ICar radial= new Radial();
car.AddDecoration(radial);

 interface ICar
  {
     int Speed { get; set; }
     void Accelerate();
  }

  class Car : ICar
  {
            private int speed = 0;

            public int Speed
            {
                get
                {
                    return speed;
                }
                set
                {
                    speed = value;
                }
            }

            public virtual void Accelerate()
            {
                Speed += 5;
            }
    }

    abstract class CarModification : ICar
    {
        private ICar modifiedCar;

        public ICar ModifiedCar
        {
            get { return modifiedCar; }
            set { modifiedCar = value; }
        }

        public virtual int Speed
        {
            get
            {
                return modifiedCar.Speed;
            }
            set
            {
                modifiedCar.Speed = value;
            }
        }

        public void Accelerate()
        {
            modifiedCar.Accelerate();
        }
    }

    class Radial : CarModification
    {
        public void Accelerate()
        {
            base.Accelerate();
            Speed += 1;
        }
    }

【问题讨论】:

  • 它必须在接口中定义,随后在具体类中也是如此。
  • 那我还需要在抽象装饰类中实现它吗?第二部分呢?
  • 这不是实现装饰器模式的典型方式。装饰器应该在构造函数中使用装饰对象,并且装饰器和装饰器都实现相同的接口/抽象类。
  • 能否请你为此写一个小代码sn-p

标签: c# design-patterns


【解决方案1】:
    interface ICar
    {
        int Speed { get; set; }
        void Accelerate();
    }

    class Car : ICar
    {
        public int Speed { get; set; }
        public virtual void Accelerate()
        {
            Speed += 5;
        }
    }

    class Radial : ICar
    {
        private readonly ICar modified;

        Radial(ICar modified)
        {
            this.modified = modified;
        }

        public int Speed
        {
          get { return modified.Speed;
          set { modified.Speed = value; }
        }

        public void Accelerate()
        {
            modified.Accelerate();
            modified.Speed += 1;
        }
    }


    ICar car = new Radial(new Car());
    car.Accelerate();

【讨论】:

  • 我想要相反的,ICar car=new Car(); ICar 径向=新径向(); car.AddDecoration(radial);
  • 那么也许你不想要装饰器模式?
猜你喜欢
  • 2016-09-28
  • 2015-07-25
  • 2019-02-27
  • 2016-05-08
  • 2012-01-17
  • 2020-08-14
  • 2019-02-06
  • 2012-04-11
  • 2015-04-26
相关资源
最近更新 更多