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());  
              
        }  
          
      
    }  
    

      结果:

        

  • 相关阅读:
    【Spring学习随笔】1. Spring的体系结构
    MySQL图形化安装相关总结(含软件分享)
    Spring Bean 基于注解的装配
    vue的三种图片引入方式
    wx.navigateTo({ url: '', }) 跳转无效问题
    JDK环境变量配置
    如何实现Vue底部按钮点击加载更多
    Java Web学习路线
    百度地图循环添加标注,并循环为鼠标悬停标注时信息窗口问题解决
    mvc jquery 修改 viewbag
  • 原文地址:https://www.cnblogs.com/swfzzz/p/8528175.html
Copyright © 2011-2022 走看看