装饰模式又名包装模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰模式使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。
抽象构件角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件角色:定义一个将要接收附加责任的类。
装饰角色:持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰角色:负责构件对象“贴上”附加的责任。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Generic;
using System.Text;
namespace Simple_Factory
{
abstract class Component
{
abstract public void Operation();
}
{
abstract class Component
{
abstract public void Operation();
}
class ConcreateComponent:Component
{
public override void Operation()
{
Console.WriteLine("ConcreateComponent.Operation()");
}
}
{
public override void Operation()
{
Console.WriteLine("ConcreateComponent.Operation()");
}
}
abstract class Decorator:Component
{
protected Component component;
{
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
{
this.component = component;
}
public override void Operation()
{
if (component != null)
component.Operation();
}
}
{
if (component != null)
component.Operation();
}
}
class ConcreateDecoratorA : Decorator
{
private string addedState;
{
private string addedState;
public override void Operation()
{
base.Operation();
addedState = "new state";
Console.WriteLine("ConcreateDecoratorA.Operation()");
}
}
{
base.Operation();
addedState = "new state";
Console.WriteLine("ConcreateDecoratorA.Operation()");
}
}
class ConcreateDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
}
{
public override void Operation()
{
base.Operation();
AddedBehavior();
}
void AddedBehavior() { }
}
}
class Decorator_Pattern
{
public static void Main()
{
ConcreateComponent c = new ConcreateComponent();
ConcreateDecoratorA d1 = new ConcreateDecoratorA();
ConcreateDecoratorB d2 = new ConcreateDecoratorB();
{
public static void Main()
{
ConcreateComponent c = new ConcreateComponent();
ConcreateDecoratorA d1 = new ConcreateDecoratorA();
ConcreateDecoratorB d2 = new ConcreateDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.SetComponent(d1);
d2.Operation();
}
}
}
}
}
}
在以下情况下应当使用装饰模式:
1,需要扩展一个类的功能,或给一个类增加附加责任
2,需要动态地给一个对象增加功能,这些功能可以再动态地撤销
3,需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。