MaoBisheng

Asp.Net(C#) & SQL & Oracle

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

9. Decorator 装饰模式  2008-8-16

动机(Motivation)

在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态(编译时)特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。

如何使“对象功能的扩展”能够根据需要来动态(运行时)地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?

意图(Intent

动态地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。          ——《设计模式》GoF

 

 

基本代码:

    //Component类
    abstract class Component
    {
        
public abstract void Operation();
    }

 

    //ConcreteComponent类
    class ConcreteComponent : Component
    {
        
public override void Operation()
        {
            Console.WriteLine(
"具体对象的操作");
        }
    }

 

注:Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。

    但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。

    //Decorator类
    abstract class Decorator : Component
    {
        
protected Component component;

        
public void SetComponent(Component component)
        {
            
this.component = component;
        }

        
public override void Operation()
        {
            
if (component != null)
            {
                component.Operation();
            }
        }
    }

 

    //ConcreteDecoratorA类
    class ConcreteDecoratorA : Decorator
    {
        
//本类独有的功能,以区别ConcreteDecoratorB
        private string addedState;

        
public override void Operation()
        {
            
//首先运行原Component的Operation
            base.Operation();
            
//再执行本类的功能,如addedState,相当于对原Component进行类装饰
            addedState = "Ner State";
            Console.WriteLine(
"具体装饰对象A的操作");
        }
    }

 

    //ConcreteDecoratorB类
    class ConcreteDecoratorB : Decorator
    {
        
public override void Operation()
        {
            
//首先运行原Component的Operation
            base.Operation();
            
//再执行本类的功能,如AddedBehavior,相当于对原Component进行类装饰
            AddedBehavior();
            Console.WriteLine(
"具体对象B的操作");
        }

        
//本类独有的功能,以区别ConcreteDecoratorB
        private void AddedBehavior()
        {

        }
    }

 

Decorator的几个要点

通过采用组合而非继承的手法 Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的灵活性差多子类衍生问题

Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。

Decorator模式并非解决多子类衍生的多继承问题,Decorator模式应用的要点在于解决主体类在多个方向上的扩展功能”——是为装饰的含义。

适用性

在以下情况下应当使用装饰模式:

1.需要扩展一个类的功能,或给一个类增加附加责任。

2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

 

 

 

posted on 2008-08-16 16:21  MaoBisheng  阅读(579)  评论(1编辑  收藏  举报