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

    1、定义:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

    2、理解:子类扩展毕竟是静态的方案,由于是静态的方案毕竟没有动态的扩展灵活,所以对于动态扩展来说,要灵活很多,这或许也是装饰者模式的一个重要体现。

    3、开发的观念:我们所设计的类要对扩展开放,对修改关闭。当我们设计的类不能满足我们的需求的时候,我们可能设计一个类去继承它,但是这样就会使对象之间高度的耦合,解耦的时候,或者说需要维护的时候会造成很多不必要的麻烦,这个时候,我们就可以考虑一下使用装饰者模式了,装饰者模式简单来说,就是把对象嵌入我们要扩展功能的类中,调用他的方法,然后跟我们定义的方法一起返回我们需要的类型。这个可能跟适配器模式有点相似,但是他们所针对的点不一样。

    4、装饰者模式UML图:

                        

    5、例子:当我们去咖啡厅的时候。不知道是不是会遇到这种问题呢?本来你点一杯普通的coffe,然后他的价格是10元,但是你尝了之后发现有点苦,想要加点红糖,然后加这个糖的价格是2元;然后过了一会你的朋友过来了,他叫了一杯普通coffee,然后加了点牛奶(假设可以加),这个牛奶的价格是3元,如果叫你设计一个程序负责这部分的内容,你会怎么做呢?

    会不会有人这么想,java不是面向对象的语言吗?我们可以通过设计对象来啊,首先创建coffee一个抽象类,然后在列出可能添加调料的可能食品,然后付款的时候,调用方法不就行了吗?确实这样做是可以的,但是前面说了耦合度高,这个时候,就到了我们的装饰者出场了:

      关系图:

      

    我们要做的就是点咖啡1的时候加sugar,点咖啡2的时候加milk

    (1)创建coffee的接口

        

    package com.zqu.yqy.scdn.test.test006;  
      
    public abstract class coffee {  
        String coffeeInformation = "普通咖啡";  
        public String getCoffeeInformation(){  
            return coffeeInformation;  
        }  
        public abstract double cost();  
      
    }  
    

      实现类coffee1,coffee2:

         实现coffee1:

    package com.zqu.yqy.scdn.test.test006;  
      
    public class coffee1 extends coffee {  
        public coffee1(){  
            coffeeInformation = "coffee1";  
        }  
      
        @Override  
        public double cost() {  
            return 10.0;  
        }  
      
    }  
    

      实现coffee2:

       

    package com.zqu.yqy.scdn.test.test006;  
      
    public class coffee2 extends coffee {  
        public coffee2(){  
            coffeeInformation = "coffee2";  
        }  
      
        @Override  
        public double cost() {  
              
            return 12.0;  
        }  
      
    }  
    

      (2)调料类

    package com.zqu.yqy.scdn.test.test006;  
      
    public abstract class AddThings extends coffee {  
        public abstract String getCoffeeInformation();  
    }  
    

      实现类:

             coffee1添加牛奶:

         

    package com.zqu.yqy.scdn.test.test006;  
      
    public class milk extends AddThings{  
        coffee coff;  
        public milk(coffee c) {  
            this.coff = c;  
        }  
      
        @Override  
        public String getCoffeeInformation() {  
            String addThings = coff.getCoffeeInformation()+"添加"+"milk";  
            return addThings;  
        }  
      
        @Override  
        public double cost() {  
          
            return 3.0+coff.cost();  
        }  
      
    }  
    

         coffee2添加糖:

        

    package com.zqu.yqy.scdn.test.test006;  
      
    public class sugar extends AddThings {  
        coffee coff;  
        public sugar(coffee c) {  
            this.coff = c;  
        }  
        @Override  
        public String getCoffeeInformation() {  
            String addThings = coff.getCoffeeInformation()+"添加"+"sugar";  
            return addThings;  
        }  
      
        @Override  
        public double cost() {  
              
            return 2.0+coff.cost();  
        }  
          
      
    }  
    

      测试类:

    package com.zqu.yqy.scdn.test.test006;  
      
    public class cost {  
        public static void main(String[] args) {  
            coffee c1 = new coffee1();  
            coffee c2 = new coffee2();  
            coffee a1 = new sugar(c1);  
            coffee a2 = new milk(c1);  
            //coffee a3 = new milk(c2);  
            System.out.println(a1.getCoffeeInformation()+" "+a1.cost());  
            System.out.println(a2.getCoffeeInformation()+" "+a2.cost());  
            //System.out.println(a3.getCoffeeInformation()+" "+a3.cost());  
              
        }  
          
      
    }  
    

      结果:

        

  • 相关阅读:
    Visifire正式版(v1.1)发布
    [转]PSP机能强大!已能模拟运行WINDOWS系统?
    在Silverlight+WCF中应用以角色为基础的安全模式(一)基础篇之角色为基础的安全模式简介 Virus
    C#的加密解密算法,包括Silverlight的MD5算法 Virus
    MMORPG programming in Silverlight Tutorial (10)Implement the sprite’s 2D animation (Part IV)
    Game Script: Rescue Bill Gates
    MMORPG programming in Silverlight Tutorial (9)KeyFrame Animation
    MMORPG programming in Silverlight Tutorial (5)Implement the sprite’s 2D animation (Part II)
    MMORPG programming in Silverlight Tutorial (7)Perfect animation
    MMORPG programming in Silverlight Tutorial (3)Animate the object (Part III)
  • 原文地址:https://www.cnblogs.com/swfzzz/p/8528175.html
Copyright © 2011-2022 走看看