Skip to content

装饰(Decorator)模式 结构型模式

更新: 2023-05-24 11:11:27   字数: 0 字   时长: 0 分钟

动态的给对象增加一些职责,即增加其额外的功能。

c#
// 装饰模式示例
using System;

// 定义一个抽象类,表示被装饰者
abstract class Component
{
    public abstract void Operation();
}

// 定义一个具体的被装饰者
class ConcreteComponent : Component
{
    public override void Operation()
    {
        Console.WriteLine("具体对象的操作");
    }
}

// 定义一个装饰类,继承自Component,用于装饰被装饰者
class Decorator : Component
{
    protected Component component;

    public void SetComponent(Component component)
    {
        this.component = component;
    }

    public override void Operation()
    {
        if (component != null)
        {
            component.Operation();
        }
    }
}

// 定义一个具体的装饰类,继承自Decorator,用于具体装饰被装饰者
class ConcreteDecoratorA : Decorator
{
    private string addedState;

    public override void Operation()
    {
        base.Operation();
        addedState = "New State";
        Console.WriteLine("具体装饰对象A的操作");
    }
}

// 定义一个具体的装饰类,继承自Decorator,用于具体装饰被装饰者
class ConcreteDecoratorB : Decorator
{
    public override void Operation()
    {
        base.Operation();
        AddedBehavior();
        Console.WriteLine("具体装饰对象B的操作");
    }

    private void AddedBehavior()
    {
        Console.WriteLine("具体装饰对象B的附加操作");
    }
}

class Client
{
    static void Main(string[] args)
    {
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA d1 = new ConcreteDecoratorA();
        ConcreteDecoratorB d2 = new ConcreteDecoratorB();

        // 装饰的顺序很重要,先用ConcreteDecoratorA装饰ConcreteComponent,
        // 再用ConcreteDecoratorB装饰ConcreteDecoratorA
        d1.SetComponent(c);
        d2.SetComponent(d1);
        d2.Operation();

        Console.Read();
    }
}
你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度