C#设计模式07——装饰器模式的写法

发布时间 2023-05-09 20:27:13作者: 明志德道

装饰器模式是一种结构型设计模式,可以在不修改原始对象的基础上添加新的功能和行为。该模式通过将对象包装在具有相同接口的装饰器类中来实现此目的。

以下是5W1H分析:

What(什么)?

装饰器模式是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能和行为,而无需修改原始对象的代码。该模式通过将对象包装在具有相同接口的装饰器类中来实现这一目的。

Why(为什么)?

在实际开发中,有时候我们需要向一个已有的对象添加新的行为或者功能,但我们不希望直接修改该对象的代码,因为这可能会引入一些风险。装饰器模式提供了一种灵活的方式来向对象添加新的功能,同时又不必修改原始对象的代码,这使得程序更加灵活和可扩展。

How(如何)?

装饰器模式通过将对象包装在装饰器类中来实现。这些装饰器类实现了与原始类相同的接口,并保存了一个指向原始对象的引用。装饰器类可以根据需要添加或修改对象的行为,同时也可以将调用传递给原始对象。该模式允许创建一个具有多个嵌套装饰器的对象,从而创建出高度定制的对象。

 Where(在哪里使用)?

装饰器模式适用于以下场景:

- 需要动态地向对象添加新的功能,而这些功能可能会在运行时发生改变。
- 想要避免直接修改原始对象的代码,因为这可能会引入一些风险。
- 需要创建一个高度定制的对象,该对象的行为和功能与原始对象略有不同。

 Who(谁使用)?

装饰器模式适用于对代码的灵活性和可扩展性有要求的开发者。开发者需要明确了解原始代码的设计和实现,以便为其添加新的行为和功能。此外,装饰器模式还适用于需要在运行时动态地向对象添加功能的场景。


 Example(示例):

以下是一个简单的C#代码示例,演示了如何使用装饰器模式来添加新的行为和功能:

目标接口:

public interface IComponent
{
    void Operation();
}

具体组件:

public class ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent.Operation");
    }
}

基础装饰器类:

public class Decorator : IComponent
{
    private IComponent component;

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

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

具体装饰器类:

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");
    }
}

客户端代码:

class Program
{
    static void Main(string[] args)
    {
        IComponent component = new ConcreteComponent();
        component = new ConcreteDecoratorA(component);
        component = new ConcreteDecoratorB(component);
        component.Operation();
    }
}

输出:

ConcreteComponent.Operation
ConcreteDecoratorA.Operation
ConcreteDecoratorB.Operation