欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#设计模式之:装饰模式

程序员文章站 2022-06-13 13:50:32
...

装饰模式(Decorator):
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生在子类更为灵活

UML类图

C#设计模式之:装饰模式

Component 是定义一个对象接口,可以给这些对象动态地添加职责
ConcreteComponent是定义一个具体对象,也可以给这个对象添加一些职责
Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的.
ConcreteDecorator是具体的装饰对象,起到给一个对象装饰A装饰B添加职责的功能

// Component.cs
abstract class Component
{
    public abstract void Operation();
}
// ConcreteComponent.cs
class ConcreteComponent : Component
{
    public override void Operation()
    {
        Console.WriteLine("一个对象");
    }
}
// Decorator.cs
abstract class Decorator : Component
{
    protected Component component;

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

    public override void Operation()
    {
        if (component != null)
        {
            component.Operation();
        }
    }
}
// ConcreteDecoratorA.cs
class ConcreteDecoratorA : Decorator
{
    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("装饰A");
    }
}
// ConcreteDecoratorB.cs 
class ConcreteDecoratorB : Decorator
{
    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("装饰B");
    }
}
// test
Component c = new ConcreteComponent();
ConcreteDecoratorA a = new ConcreteDecoratorA();
ConcreteDecoratorB b = new ConcreteDecoratorB();

a.SetComponent(c);
b.SetComponent(a);

b.Operation();
// 输出
一个对象
装饰A
装饰B

总结
装饰模式是为已有功能动态地添加更多功能的一种方式
何时使用?
当系统需要添加新功能时,向旧类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为
问题在于:新加入的变量,方法或逻辑增加了主类的复杂度,但新加的这些东西可能只在某些特定情况下才会执行的特殊行为
装饰者把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,当需要执行特殊行为时,客户就可以在运行时根据需要有选择地、按顺序地使用装饰功能包括对象了

优点
把类中的装饰功能从类中搬移分离出去,可以简化原有的类,有效的把类的核心职责和装饰功能区分开,并且可以去除相关类中重复的装饰逻辑,但如果装饰顺序很重要,就要注意了