Decorate Pattern(装饰模式)

首先来明确一下装饰模式的定义:

装饰模式动态地将责任附加到对象上,若要扩展功能,装饰比继承更有弹性。

1.在装饰者模式中也用到了继承,但是继承是为了让对象有共同的类型,而不是为了从父类中继承其行为。

2.在装饰模式中,超类可以使用接口也可以使用抽象类,如果是在扩展现有代码时,避免修改代码尽量使用现有的定义,在新写代码是可以根据开发人员自己决定。

3.超类是基础对象类(比如是咖啡,茶,还是冰可乐等)和装饰类(比如 加糖,加奶等等)的基类。在装饰类中包含所要装饰的基础类对象。

下面是一个简单的例子来深刻的理解装饰模式:

场景:在图片处理过程中会有一些操作,包括加上边框,调整亮度,饱和度,旋转图片等等。

类图

代码如下:

 public abstract class Picture
    {
        public abstract void Draw();

        public abstract void AdjustmentPicure();
    }

    public class AdjustmentPicture : Picture
    {
        protected Picture _picture;

        public AdjustmentPicture(Picture picture)
        {
            this._picture = picture;
        }

        public override void Draw()
        {
            _picture.Draw();
        }

        public override void AdjustmentPicure()
        {
            _picture.AdjustmentPicure();
        }
    }

    public class ColorPhoto : Picture
    {
        public override void Draw()
        {
        }

        public override void AdjustmentPicure()
        {
        }
    }

    public class BrightnessAdjustmentPicture : AdjustmentPicture
    {
        public double Brightness { get; set; }

        public BrightnessAdjustmentPicture(Picture picture)
            : base(picture)
        { }

        public override void AdjustmentPicure()
        {
            base.AdjustmentPicure();
            Console.WriteLine("The picture has been adjusted brightness to " + Brightness.ToString());
        }

        public override void Draw()
        {
            AdjustmentPicure();
        }
    }

    public class ContrastAdjustmentPicture : AdjustmentPicture
    {
        public double Contrast { get; set; }

        public ContrastAdjustmentPicture(Picture picture)
            : base(picture)
        { }

        public override void AdjustmentPicure()
        {
            base.AdjustmentPicure();
            Console.WriteLine("The picture has been adjusted brightness to " + Contrast.ToString());
        }

        public override void Draw()
        {
            AdjustmentPicure();
        }
    }

    public class ContrastAdjustmentPicture : AdjustmentPicture
    {
        public double Contrast { get; set; }

        public ContrastAdjustmentPicture(Picture picture)
            : base(picture)
        { }

        public override void AdjustmentPicure()
        {
            base.AdjustmentPicure();
            Console.WriteLine("The picture has been adjusted brightness to " + Contrast.ToString());
        }

        public override void Draw()
        {
            AdjustmentPicure();
        }
    }

    public class FrameAdjustmentPicture : AdjustmentPicture
    {
        public FrameAdjustmentPicture(Picture picture)
            : base(picture)
        { }

        public override void AdjustmentPicure()
        {
            base.AdjustmentPicure();
            Console.WriteLine("Picture has been added frame");
        }
        public override void Draw()
        {
            AdjustmentPicure();
        }
    }

    public class RotateAdjustmentPicture : AdjustmentPicture
    {

        public double Angle { get; set; }

        public RotateAdjustmentPicture(Picture picture)
            : base(picture)
        { }

        public override void AdjustmentPicure()
        {
            base.AdjustmentPicure();
            Console.WriteLine("Picture has been Rotate " + Angle.ToString());
        }

        public override void Draw()
        {
            AdjustmentPicure();
        }
    }

 测试代码:

     static void Main(string[] args)
        {
            Picture pic = new ColorPhoto();
            pic = new BrightnessAdjustmentPicture(pic) { Brightness = 10 };
            pic = new FrameAdjustmentPicture(pic);
            pic.Draw();
        }

 测试结果:

原文地址:https://www.cnblogs.com/anthonyBlog/p/3644642.html