设计模式(9):装饰模式(Decorator patterns)
装饰模式(Decorator patterns)
定义
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
概述
在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?这就是本文要讲的Decorator模式。动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
装饰模式(Decorator patterns)结构图
定义了一个具体的类,也可以给这个对象添加一些职责。Decorator,装饰抽象类, 继承了Component从外类来扩展component类的功能,但对于component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
abstract class Component
{
public abstract void Operation();
}
class ConcreteComponent:Component
{
public override void Operation()
{
Console.WriteLine("具体对象的操作");
}
}
class Decorator:Component
{
protected Component component;
public void Setcomponent(Component component)//设置component
{
this.component=component;
}
public override void Operation()
{ //重写Operation(),实际执行的是Component的Operation()
if(compoonent!=null)
{
component.Operation();
}
}
}
class ConcreteDecpratorA:Decorator
{
private string addedState;//本类的独有功能,以区别于ConcreteBecoratorB
public vorride void Operation()
{
//首先运行原Component的Operation(),再执行本类的功能,如addedState,相当于对原Component进行了装饰。
base.Operation();
addedstate="New state";
Console.WriteLine("具体装饰对象A的操作");
}
}
class ConcreteDecpratorA:Decorator
{
public override void Operation()
{
//首先运行原Component的Operation(),再执行本类的功能,如AddedBehavior(),相当于对原Component进行了装饰。
base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰对象B的操作");
}
private void AddedBehavior()//本类的独有功能,以区别于ConcreteBecoratorA
{
}
}
static void Main(string[] args)
{
ConcreteComponent c=new ConcreteComponent();
ConcreteDecoratorA d1=new ConcreteDecoratorA();
ConcreteDecoratorB d2=new ConcreteDecoratorB();
//装饰的方法是:首先用ConcreteComponent实例化对象C,然后用ConcreteDecoratorA的实例化对象d1来包装c,
再用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation()
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
}
{
public abstract void Operation();
}
class ConcreteComponent:Component
{
public override void Operation()
{
Console.WriteLine("具体对象的操作");
}
}
class Decorator:Component
{
protected Component component;
public void Setcomponent(Component component)//设置component
{
this.component=component;
}
public override void Operation()
{ //重写Operation(),实际执行的是Component的Operation()
if(compoonent!=null)
{
component.Operation();
}
}
}
class ConcreteDecpratorA:Decorator
{
private string addedState;//本类的独有功能,以区别于ConcreteBecoratorB
public vorride void Operation()
{
//首先运行原Component的Operation(),再执行本类的功能,如addedState,相当于对原Component进行了装饰。
base.Operation();
addedstate="New state";
Console.WriteLine("具体装饰对象A的操作");
}
}
class ConcreteDecpratorA:Decorator
{
public override void Operation()
{
//首先运行原Component的Operation(),再执行本类的功能,如AddedBehavior(),相当于对原Component进行了装饰。
base.Operation();
AddedBehavior();
Console.WriteLine("具体装饰对象B的操作");
}
private void AddedBehavior()//本类的独有功能,以区别于ConcreteBecoratorA
{
}
}
static void Main(string[] args)
{
ConcreteComponent c=new ConcreteComponent();
ConcreteDecoratorA d1=new ConcreteDecoratorA();
ConcreteDecoratorB d2=new ConcreteDecoratorB();
//装饰的方法是:首先用ConcreteComponent实例化对象C,然后用ConcreteDecoratorA的实例化对象d1来包装c,
再用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation()
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
}
总结
装饰模式它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象了