C# Design Patterns (3) - Decorator
2009-06-29 07:07:51 来源:WEB开发网图 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 的操作
*/
更多精彩
赞助商链接