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

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

UML类图

这里写图片描述

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值