C#设计模式之:装饰模式
程序员文章站
2022-06-13 13:50:32
...
装饰模式(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
总结
装饰模式是为已有功能动态地添加更多功能的一种方式
何时使用?
当系统需要添加新功能时,向旧类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为
但问题
在于:新加入的变量,方法或逻辑增加了主类的复杂度,但新加的这些东西可能只在某些特定情况下才会执行的特殊行为
装饰者把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,当需要执行特殊行为时,客户就可以在运行时根据需要有选择地、按顺序地使用装饰功能包括对象了
优点
把类中的装饰功能从类中搬移分离出去,可以简化原有的类,有效的把类的核心职责和装饰功能区分开,并且可以去除相关类中重复的装饰逻辑,但如果装饰顺序很重要,就要注意了
上一篇: Spring Cloud 学习 - Gateway新一代网关
下一篇: C++设计模式——装饰者模式