今天老师给讲了讲装饰模式这一块,经总结,有以下几点:
l 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象和抽象装饰器。
l 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
l 抽象装饰(Decorator)角色:持有一个构件(Component)对象的实例,以用来对它进行装饰,并定义一个与抽象构件接口一致的接口。
l 具体装饰(Concrete Decorator)角色:负责给构件对象"加上"附加的功能。
结构图代码:
//抽象构件,定义了具体构件和抽象装饰要实现的方法
interface Component
{
void Operation();
}
//定义具体构件
class ConcreteComponent : Component
{
public void Operation()
{
Console.WriteLine("ConcreteComponent Operation");
}
}
//定义抽象装饰者。抽象装饰者也实现了抽象构件的接口
abstract class Decorator : Component
{
//把一个抽象构件作为抽象装饰的成员变量。
protected Component comp;
//在抽象装饰者的构造函数中为抽象构件初始化。
public Decorator(Component c)
{
this.comp = c;
}
//还未实现的接口的方法。
public abstract void Operation();
}
//具体装饰者A,继承自抽象装饰。
class ConcreteDecoratorA : Decorator
{
private string addedState; //具体装饰者中新增的成员变量
public ConcreteDecoratorA(Component c) : base(c) { }
public string AddedState //具体装饰者中新增的属性
{
set
{
addedState = value;
}
}
//具体装饰者实现了接口中定义的方法
public override void Operation()
{
comp.Operation(); //可以调用原构件对象的Operation方法。
Console.WriteLine("ConcreteDecoratorA Operation {0}",addedState);
}
}
//具体装饰者B,继承自抽象装饰。
class ConcreteDecoratorB : Decorator
{
public ConcreteDecoratorB(Component c) : base(c) { }
public override void Operation()
{
comp.Operation(); //可以调用原构件对象的Operation方法。
Console.WriteLine("ConcreteDecoratorB Operation ");
}
// 具体装饰者实现了接口中定义的方法
public void AddedBehavior()
{
Console.WriteLine("This is Added Behavior");
}
}
class Client
{
public static void Main()
{
//原生的具体构件
ConcreteComponent cc = new ConcreteComponent();
cc.Operation();
//把原生的具体构件用具体装饰者A进行一次包装
ConcreteDecoratorA cda = new ConcreteDecoratorA(cc);
cda.AddedState = "Decorator OK ";
cda.Operation();
//把原生的具体构件用具体装饰者B进行一次包装
ConcreteDecoratorB cdb = new ConcreteDecoratorB(cc);
cdb.AddedBehavior();
cdb.Operation();
//把被A包装完的具体构件再用用具体装饰者B进行二次包装
ConcreteDecoratorB cdbcda = new ConcreteDecoratorB(cda);
cdbcda.Operation();
}
}