zoukankan      html  css  js  c++  java
  • 设计模式之装饰者模式

            装饰者模式,就是动态的给一个对象添加一些职责,他比生成子类更为灵活。这个模式是非常重要的,在我们设计完系统之后,一定还会进行修改,给他添加功能,这时候装饰者模式的好处就不言而喻了。

            装饰者模式的工作原理是,创建一个初始对象,然后一步一步的给他添加功能,或者属性。

            举个例子:假如初始对象是一个空办公室为装饰对象,通过装饰者1,成为一个有两张办公桌的办公室,这样有两张办公桌的办公室就变成了新的装饰对象。然后这个对象在通过装饰者2 ,变成有电脑的,有办公桌的办公室。这样有电脑的,有办公桌的办公室就变成了新的装饰对象。然后一步一步的去装饰最后变成一个具体的对象,如图所示,像一个链表一样:

         

           现在看一下类图:

           

            下面举一个具体的例子,有一个办公室,里边原来是空的,现在要放的桌子,过几天有要求又要放一个电脑,然后过了一段时间, 又要求放一个花盆。根据开闭原则不能修改,只能增加,所以想到用装饰者模式。

             看一下具体的类图,然后对比一下上边给的抽象话的类图,有助于你更好地理解抽象模式:

             

            下边看一下代码:

     //抽象办公室
        abstract  class Bangongshi
        {
            public abstract void Show(); 
        }
    
        //具体办公室
        class Jutibangongshi:Bangongshi
        {
            public Jutibangongshi()
            { }
            public string name;
            public Jutibangongshi(string name)
            {
                this.name = name;
            }
    
            public override void Show()
            {
                Console.WriteLine("装饰的{0}", name);
                
            }
        }
    
        //办公室装饰
        class Zhuangshi : Bangongshi
        {
            protected Bangongshi bangongshi;
            public void SetBangongshi(Bangongshi bangongshi)
            {
                this.bangongshi = bangongshi;
            }
            public override void Show()
            {
                if (bangongshi != null)
                {
                    bangongshi.Show();
                }
            }
        }
    
        //桌子
        class Zhuozi : Zhuangshi
        {
            private string addThing;
            public override void Show()
            {
                addThing = "桌子";
                Console.Write(addThing);
                base.Show();
            }
        }
    
        //电脑
        class Diannao : Zhuangshi
        {
            private string addThing;
            public override void Show()
            {
                addThing = "电脑";
                Console.Write(addThing);
                base.Show();
            }
     
        }
    
        //花盆
        class Huapen : Zhuangshi
        {
            private string addThing;
            public override void  Show()
            {
                addThing = "花盆";
                Console.Write(addThing);
     	         base.Show();
            }
        }

          客户端代码:

     //客户端
     static void Main(string[] args)
         {
             Jutibangongshi office = new Jutibangongshi("办公室");
    
             Zhuozi desk = new Zhuozi();
             Diannao computer = new Diannao();
             Huapen glass = new Huapen();
    
             desk.SetBangongshi(office);
             computer.SetBangongshi(desk);
             glass.SetBangongshi(computer);
    
             glass.Show();
            }

    看一下结果:


            其实,装饰者模式呢,它把类中的一些装饰功能移除,再将这些装饰功能写到另外的类中,这样可以简化核心类的复杂度,同时,面对不同的需求时,可以提供代码得复用。

            装饰器模式允许我们在实现中提供扩展点。你可能注意到,在实现装饰者时,我从来没有涉及到Component类。因此,即使它并不拥有类,一样能通过动态添加行为类装饰它,甚至是递归的方式。这些额外的行为可能在几处行为之前或之后添加,或者这种行为可能被阻止。装饰者能在类中提供新方法,甚至新属性。

           当然在使用装饰者模式的时候,也一定要慎重,不要感觉差不多,就用装饰模式。所有事情都点到为止。好了,今天就写到这里,以后还会继续更新设计模式博客,请你继续关注。欢迎您能够提出宝贵意见。谢谢




  • 相关阅读:
    树莓派关闭swap文件[浙大嵌入式系统]
    树莓派之objdump [浙大嵌入式系统]
    树莓派RAM[浙大嵌入式系统]
    温湿度传感器dht11的lcd显示[嵌入式系统]
    ucos II[嵌入式系统]
    MooTools 1.4 源码分析 Fx.CSS
    MooTools 1.4 源码分析 (关于Core、Type等模块分析)
    MooTools 1.4 源码分析 Fx.Tween
    MooTools Class.Mutators 如何建立一个我们自己的Mutator
    Javascript各种循环测试,达夫设备可用性分析
  • 原文地址:https://www.cnblogs.com/riasky/p/3469161.html
Copyright © 2011-2022 走看看