博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式——装饰模式(Decorator patterns)

Posted on 2008-08-26 14:16  Anna Yang  阅读(224)  评论(0编辑  收藏  举报

设计模式(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();
}

 

总结

     装饰模式它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象了