重温设计模式 --- 装饰器模式

2023-10-22 16:38:10 浏览数 (2)

引言

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

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

基本类接口

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

代码语言:javascript复制
//定义基本对象接口
public  interface  IComponent
{
    void Operation();
}

基本类实现

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

代码语言:javascript复制
//IComponent接口的实现类
public  class  ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent.Operation()");
    }
}

装饰器抽象

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

代码语言:javascript复制
//装饰器抽象
public  abstract  class  Decorator : IComponent
{
    private IComponent component;

    public Decorator(IComponent component)
    {
        this.component = component;
    }

    public virtual void Operation()
    {
        component.Operation();
    }
}

装饰器实现

代码语言:javascript复制
//实现多个装饰器类
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()");
    }
}

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

代码语言:javascript复制
IComponent component = new ConcreteComponent();

IComponent decoratorA = new ConcreteDecoratorA(component);

IComponent decoratorB = new ConcreteDecoratorB(decoratorA);

decoratorB.Operation();

输出如下:

代码语言:javascript复制
ConcreteComponent.Operation()

ConcreteDecoratorA.Operation()

ConcreteDecoratorB.Operation()

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

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

结论

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

0 人点赞