装饰模式

来源:互联网 发布:java银行叫号系统 编辑:程序博客网 时间:2024/04/28 09:54
装饰模式

“装饰模式(Decorator)”又名“包装模式(Wrapper)”,通常用来灵活地扩充对象的功能

在此之前我们可以通过类的继承来扩充父类的功能,但这种继承方式缺乏灵活性,并且会导到子类数量的快速膨胀。恰当地使用装饰模式我们会轻松实现在控制子类数量的基础上,灵活地实现对象功能的扩展。装饰模式比类的继承更灵活。

clip_image001

结构图代码:

//抽象构件,定义了具体构件和抽象装饰要实现的方法

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();

}

}