注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

长风明志的博客

不要也不能做下一个谁,应该且可以做第一个自己

 
 
 

日志

 
 

设计模式3:装饰模式  

2013-09-13 15:04:04|  分类: 设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
装饰模式UML设计图:
设计模式3:装饰模式 - changfengmingzhi - 长风明志的博客
1.Component类

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

2.ConcreteComponent类

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

3.Decorator类

abstract class Decorator : Component
{
      protected Component component;
      public void Decorate( Component component)    /*装饰组件*/
      {
             this.component=component;
      }
      public override void Operation()
      {
             if(component !=null)
             {
                  component.Operation();
             }
      }
}


4.ConcreteDecoratorA类

class ConcreteDecoratorA : Decorator
{
          private string addedState;              /*本类的独有功能,用于区别于ConcreteDecoratorB*/
          public override void Operation()
          {
                   base.Operation();            /*首先运行原Component的Operation()*/
                   addState="New State":
                   Console.WriteLine("具体装饰对象A的操作");        /*再执行本类的功能,相当于对原Component进行了装饰*/
          }
}


5.ConcreteDecoratorB类

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

 
6.客户端代码:

static void Mian(string [] args)
{
       ConcreteComponent c=new ConcreteComponent();
       ConcreteDecoratorA d1=new ConcreteDecoratorA();
       ConcreteDecoratorB d2=new ConcreteDecoratorB();
       d1.Decorate(c);     /*一步一步进一步封装*/
       d2.Decorate(d1);
       d2.Operation();
}

从上面的代码可以看到,装饰模式 利用Decorate来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个装饰对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对项链当中。当要执行特殊行为时,客户端代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象。装饰模式把一类的核心功能和装饰功能分离开来(通过继承原来的类并实现装饰功能),从而简化原来的类。

注:博客内容摘自《大话设计模式》
  评论这张
 
阅读(101)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017