装饰器模式(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();
}
}