装饰模式
“装饰模式(Decorator)”又名“包装模式(Wrapper)”,通常用来灵活地扩充对象的功能。
在此之前我们可以通过类的继承来扩充父类的功能,但这种继承方式缺乏灵活性,并且会导到子类数量的快速膨胀。恰当地使用装饰模式我们会轻松实现在控制子类数量的基础上,灵活地实现对象功能的扩展。装饰模式比类的继承更灵活。
结构图代码:
//抽象构件,定义了具体构件和抽象装饰要实现的方法
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();
}
}