码迷,mamicode.com
首页 > 其他好文 > 详细

装饰模式

时间:2017-08-29 14:19:46      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:orb   使用   protected   有一个   nbsp   margin   crete   str   his   

修饰模式:

abstract class Component

  {

    public abstract void Operation();

 

  }

  class ConcreteComponent:Component

  {

    public override void Operation()

    {

    Console.WritrLine("具体对象的操作");

    }

  }

  abstract class Decorator:Component  

  {

    protected Component component;

    public void SetComponent(Component component)    //设置Component

    {

    this.component=component;

    }

    public override void Operation()              //重写Operation(),实际执行的是Component类的Operation()

    {

      if(component !=null)

      {

      component.Operation();

      }

    }

  } 

  class ConcreteDecoratorA:Decorator

  {

    private String addedState;        //本类独有的功能,以区别于ConcreteDecoratorB

    public override void Operation()

    {

      base.operation();          //首先运行的是Component的Operation(),再执行本类功能,如addedState,相当于对Component进行修饰。

      addedState="new State";

    Console.WriteLine("具体装饰对象A的操作");

  }

  }

  class ConcreteDecoratorB:Decorator

  {

  public override void Operation()        //首先运行的是Component的Operation(),再执行本类功能,如AddedBehavior(),相当于对Component进行修饰。

  {

  base.operator();

  AddedBehavior();

  Console.WriteLine("具体装饰对象B的操作");

  }

  private void AddedBehavior()

  {

  }

  }

  public class Client

  {

    static void main(String[] args)

  {

    ConcreteComponet c=new ConcreteComponent();

    ConcreteDecoratorA a=new ConcreteDecoratorA();

    ConcreteDecoratorB b=new ConcreteDecoratorB();

 

    a.SetComponent(c);   //装饰的方法是:首先用ConcreteComponent实例化c,用ConcreteDecoratorA实例化对象a对c进行包装,用ConcreteComponentB对象b对a进行包装,最终执行b的Operation()

    b.SetComponent(a);

    b.Operation();

    Console.read();

  }

  }

   装饰模式死利用SetCodecomponent来对对象进行包装的,每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象值关心自己的功能,不关心被添加到对项链当中(DPE)。

   如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以作为ConcreteComponent类的子类;同样道理,如果只有一个ConcreteDecorator类,那么就没有必要脚力一个单独的Decorator类,而可以吧Decorator和ConcreteDecorator的责任合并成一个类。

    装饰模式是为已有功能动态地添加更多功能的一种方式;当系统需要新功能时,是想旧的类中添加新的代码,新的代码通常装饰了原有类的核心职责或主要行为,他们在主类中添加新的新的字段、新的逻辑、新的方法,从而增加主类的复杂度,而这些新加入的东西仅仅是为了满足特定情况下才会执行的特殊行为的需要,而装饰模式提供了一个非常好的解决办法,把每个装饰的功能放在单独的类中,并让这个类包装她要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象。

    简单总结,装饰模式的优点是,吧类中的装饰功能从类中摘除,可以简化原有的类;有效的吧类的核心职责和装饰功能区分开来,去除相关类中重复的装饰逻辑。   

装饰模式

标签:orb   使用   protected   有一个   nbsp   margin   crete   str   his   

原文地址:http://www.cnblogs.com/pm-xidian-edu/p/7447268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!