首先来明确一下装饰模式的定义:
装饰模式动态地将责任附加到对象上,若要扩展功能,装饰比继承更有弹性。
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(); }
测试结果: