Decorator Pattern (装饰模式)
装饰模式可「动态」地给一个对象添加一些额外的职责,提供有别于「继承」的另一种选择。就扩展功能而言,Decorator Pattern 透过 Aggregation (聚合) 的特殊应用,降低了类与类之间的耦合度,会比单独使用「继承」生成子类更为灵活。
一般用「继承」来设计子类的做法,会让程序变得较僵硬,其对象的行为,是在「编译」时期就已经「静态」决定的,而且所有的子类,都会继承到相同的行为;然而,若用「装饰模式」以及 UML 的 Aggregation 的设计,来扩展对象的行为,就能弹性地 (flexible) 将多个「装饰者」混合着搭配使用,而且是在「执行」时期「动态」地进行扩展。
此外,若用一般「继承」的做法,每当对象需要新行为时,必须修改既有的代码、重新编译;但若透过「装饰模式」,则无须修改既有代码。
The Decorator Pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
- Design Patterns: Elements of Reusable Object-Oriented Software
图 1 此图为 Decorator 模式的经典 Class Diagram
01_Shell / Program.cs
using System;
namespace _01_Shell
{
//客户端程序
class Program
{
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
//让 ConcreteDecorator 在运行时,动态地给 ConcreteComponent 增加职责
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
Console.Read();
}
}
//装饰者、被装饰者的共同基类
abstract class Component
{
public abstract void Operation();
}
//被装饰者。具体被装饰对象。
//此为在「执行」时期,会被 ConcreteDecorator 具体装饰者,「动态」添加新行为(职责)的对象
class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("具体被装饰对象的操作");
}
}
//装饰者。
//此为所有装饰者,应共同实现的抽象类或接口
abstract class Decorator : Component
{
//以父类声明的字段。
//实现 UML Class Diagram 的 Aggregation,指向 Component 对象的指针。
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Operation()
{
if (component != null)
{
component.Operation();
}
}
}
//具体装饰者 A
//此为在「执行」时期,替 ConcreteComponent「动态」添加新行为(职责)的对象
class ConcreteDecoratorA : Decorator
{
//装饰者可以添加新的栏位
private string addedState;
public override void Operation()
{
base.Operation();
addedState = "New State";
Console.WriteLine("具体装饰对象 A 的操作");
}
}
//具体装饰者 B
//此为在「执行」时期,替 ConcreteComponent「动态」添加新行为(职责)的对象
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰对象 B 的操作");
}
//装饰者可以添加新的方法
private void AddedBehavior()
{
}
}
} // end of namespace
/*
执行结果:
具体被装饰对象的操作
具体装饰对象 A 的操作
具体装饰对象 B 的操作
*/
NET技术:C# Design Patterns (3) - Decorator,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。