• 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();
            }

     测试结果:

  • 相关阅读:
    java getEnv不区分大小写 getProperty区分大小写
    spring 解析配置文件问题
    (转载)Java里快如闪电的线程间通讯
    quartz中关键类
    HTTP中缓存相关
    (转载)javascript函数作用域和提前声明
    (转载)ETL利器Kettle实战应用解析系列一【Kettle使用介绍】
    rcnn 理解笔记
    打乱图片顺序,按一定比例分别存放
    Python 批量读取文件夹下的图片,并保存在文档下
  • 原文地址:https://www.cnblogs.com/anthonyBlog/p/3644642.html
Copyright © 2020-2023  润新知