# 装饰器模式

属于结构型模式,它是作为现有的类的一个包装。
装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为,提供了额外的功能。

装饰器模式包含以下几个核心角色:

  1. 抽象组件:定义了原始对象和装饰器对象的公共接口或抽象类,可以是具体组件类的父类或接口。
  2. 具体组件:是被装饰的原始对象,它定义了需要添加新功能的对象。
  3. 抽象装饰器:继承自抽象组件,它包含了一个抽象组件对象,并定义了与抽象组件相同的接口,同时可以通过组合方式持有其他装饰器对象。
  4. 具体装饰器:实现了抽象装饰器的接口,负责向抽象组件添加新的功能。具体装饰器通常会在调用原始对象的方法之前或之后执行自己的操作。

装饰器模式通过嵌套包装多个装饰器对象,可以实现多层次的功能增强。每个具体装饰器类都可以选择性地增加新的功能,同时保持对象接口的一致性。

# 类图

  1. 创建形状的接口,由具体的形状实现接口。
  2. 创建形状装饰器抽象类,实现形状的接口。
  3. 创建具体的装饰器类,并对传入的对象进行装饰。

img

# 代码

# 接口

namespace StructuralPattern_DecoratorPattern
{
    public interface IShape
    {
        /// <summary>
        /// 形状
        /// </summary>
        public void MyShape();
    }
}

# 实现接口的类

namespace StructuralPattern_DecoratorPattern
{
    /// <summary>
    /// 圆形
    /// </summary>
    public class Circle : IShape
    {
        public void MyShape()
        {
            Console.WriteLine("Circle");
        }
    }
}
namespace StructuralPattern_DecoratorPattern
{
    /// <summary>
    /// 正方形
    /// </summary>
    public class Square : IShape
    {
        public void MyShape()
        {
            Console.WriteLine("Square");
        }
    }
}

# 装饰器抽象类

namespace StructuralPattern_DecoratorPattern
{
    /// <summary>
    /// 形状装饰器
    /// </summary>
    public abstract class ShapeDecorator : IShape
    {
        protected IShape Shape;
        public ShapeDecorator(IShape shape)
        {
            Shape = shape;
        }
        public virtual void MyShape()
        {
            Shape.MyShape();
        }
    }
}

# 具体的装饰器

namespace StructuralPattern_DecoratorPattern
{
    /// <summary>
    /// 红色形状装饰器
    /// </summary>
    public class RedShapeDecorator : ShapeDecorator
    {
        public RedShapeDecorator(IShape shape) : base(shape) { }
        public override void MyShape()
        {
            base.MyShape();
            Console.WriteLine("Turn red\n");
        }
    }
}

# 测试

namespace StructuralPattern_DecoratorPattern
{
    public class Program
    {
        private static void Main()
        {
            Circle circle = new Circle();
            Square square = new Square();
            RedShapeDecorator redCircle = new RedShapeDecorator(circle);
            RedShapeDecorator redSquare = new RedShapeDecorator(square);
            redCircle.MyShape();
            redSquare.MyShape();
        }
    }
}

运行结果:
Circle
Turn red

Square
Turn red