2023-03-22
设计模式
00
请注意,本文编写于 395 天前,最后修改于 395 天前,其中某些信息可能已经过时。

目录

引言
基本类接口
基本类实现
装饰器抽象
装饰器实现
结论

引言

装饰器模式是一种结构型设计模式,它允许在不改变原始对象的情况下,通过将其包装在一个装饰器对象中,来动态地添加额外的功能。

装饰器模式的核心思想是,将一个对象放在另一个对象的外面,以给原始对象添加新的行为。这个“另一个对象”就是装饰器(Decorator),它持有一个原始对象(Component)的引用,并实现与原始对象相同的接口。装饰器可以通过调用原始对象的方法,来执行自己的行为。这种方式可以动态地添加、删除或替换对象的行为,而不需要修改原始对象的代码。

基本类接口

定义一个基本对象接口或抽象类,称为Component,它定义了一些基本操作:

csharp
//定义基本对象接口 public interface IComponent { void Operation(); }

基本类实现

定义一个实现IComponent接口的具体类:

csharp
//IComponent接口的实现类 public class ConcreteComponent : IComponent { public void Operation() { Console.WriteLine("ConcreteComponent.Operation()"); } }

装饰器抽象

定义一个装饰器抽象类或接口,称为Decorator,它也实现了Component接口,并在其中添加了一些新的操作:

csharp
//装饰器抽象 public abstract class Decorator : IComponent { private IComponent component; public Decorator(IComponent component) { this.component = component; } public virtual void Operation() { component.Operation(); } }

装饰器实现

csharp
//实现多个装饰器类 public class ConcreteDecoratorA : Decorator { public ConcreteDecoratorA(IComponent component) : base(component) { } public override void Operation() { base.Operation(); Console.WriteLine("ConcreteDecoratorA.Operation()"); } } public class ConcreteDecoratorB : Decorator { public ConcreteDecoratorB(IComponent component) : base(component) { } public override void Operation() { base.Operation(); Console.WriteLine("ConcreteDecoratorB.Operation()"); } }

接着,我们可以创建并使用一个具有特定功能对象:

csharp
IComponent component = new ConcreteComponent(); IComponent decoratorA = new ConcreteDecoratorA(component); IComponent decoratorB = new ConcreteDecoratorB(decoratorA); decoratorB.Operation();

输出如下:

csharp
ConcreteComponent.Operation() ConcreteDecoratorA.Operation() ConcreteDecoratorB.Operation()

上文例子中,我们创建了一个基本对象ConcreteComponent,并创建了两个装饰器ConcreteDecoratorAConcreteDecoratorB,最后,我们使用这些装饰器来创建一个具有特定功能的对象,并调用它的操作方法。输出结果显示,这个对象实际上执行了多个操作,包括基本操作和添加的操作。

提示

装饰器模式有一些缺点。首先,它可能会导致对象数量的增加,因为每个装饰器都需要一个单独的对象。其次,由于装饰器可以相互嵌套,因此在创建复杂的装饰器结构时可能会变得难以理解和维护。

结论

装饰器模式的优点是它可以动态地添加对象的新行为,而无需改变其原始类。这样,我们可以通过组合不同的装饰器来创建多种对象变体,同时保持原始对象的完整性和一致性。且装饰器模式遵循开放/封闭原则,因为它允许我们添加新的功能,而无需修改现有代码。

本文作者:Peter.Pan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!