装饰器模式(Decorator
Pattern)是一种结构型设计模式,用于动态地给对象添加额外的职责,而不改变其原始类的结构。它允许向对象添加行为,而无需生成子类。
实现原理:
装饰器模式通过创建一个包装对象来包裹原始对象,并在包装对象上添加额外的功能。这种模式允许将一个或多个装饰器叠加在原始对象上,从而实现功能的组合。
思路:
- 定义一个抽象组件接口,该接口声明了原始对象和装饰器的公共方法。
- 创建具体组件类,实现抽象组件接口,表示原始对象。
- 创建抽象装饰器类,实现抽象组件接口,包含一个对抽象组件的引用,并在其基础上添加额外的功能。
- 创建具体装饰器类,继承自抽象装饰器类,实现具体的装饰功能。
- 在客户端代码中,通过组合装饰器对象来动态地添加功能。
优点:
- 对扩展开放、对修改封闭:通过装饰器模式,可以在不修改原始类的情况下动态地添加新功能,使得代码更加灵活、可扩展。
- 遵循单一职责原则:每个装饰器只关注于单一功能的添加,使得代码更易于理解和维护。
C#代码示例:
using System;// 抽象组件接口
interface IComponent
{void Operation();
}// 具体组件类
class ConcreteComponent : IComponent
{public void Operation(){Console.WriteLine("ConcreteComponent Operation");}
}// 抽象装饰器类
abstract class Decorator : IComponent
{protected IComponent _component;public Decorator(IComponent component){this._component = component;}public virtual void Operation(){if (_component != null){_component.Operation();}}
}// 具体装饰器类
class ConcreteDecoratorA : Decorator
{public ConcreteDecoratorA(IComponent component) : base(component){}public override void Operation(){base.Operation();Console.WriteLine("ConcreteDecoratorA Operation");}
}class ConcreteDecoratorB : Decorator
{public ConcreteDecoratorB(IComponent component) : base(component){}public override void Operation(){base.Operation();Console.WriteLine("ConcreteDecoratorB Operation");}
}class Program
{static void Main(string[] args){// 创建具体组件对象IComponent component = new ConcreteComponent();// 使用装饰器A装饰具体组件Decorator decoratorA = new ConcreteDecoratorA(component);decoratorA.Operation();Console.WriteLine("-----------");// 使用装饰器B装饰具体组件Decorator decoratorB = new ConcreteDecoratorB(component);decoratorB.Operation();Console.WriteLine("-----------");// 使用装饰器A和B叠加装饰具体组件Decorator decoratorAB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));decoratorAB.Operation();}
}