• 关于装饰者模式的层层调用


        学习装饰者模式的时候,关于装饰者的层层调用觉得很是不明白。想到了好多,因为以前没这样写过。

    Beverage beverage = new DarkRoast();
    //就是来搞明白怎么回事。怎么层层调用
    beverage = new Whip(beverage);
    beverage = new Soy(beverage);
    beverage = new Mocha(beverage);

        实在看书没想明白,于是写了一遍代码,才发现被我忽略了一部分代码。不过还是写一下记录记录。

        //Soy类  代码

    public class Soy extends CondimentDecorator {
       Beverage beverage;
    
        public Soy(Beverage beverage){
            this.beverage = beverage;//beverage=Mocha
        }
        @Override
        public String getDescription() {        
            return beverage.getDescription() +" , Soy";
        }
        public double cost(){
            System.out.println("Soy cost"+" "+beverage.toString());
            return 0.15 + beverage.cost();
        }         
    }

    //Whip类  代码

    public class Whip extends CondimentDecorator {
       Beverage beverage;
    
        public Whip(Beverage beverage){
            this.beverage = beverage; //beverage = DarkRoast
        }
        @Override
        public String getDescription() {
        
            return beverage.getDescription() +" , Whip";
            
        }
        public double cost(){
             System.out.println("Whip post"+" "+beverage.toString());
             
            return 0.10+beverage.cost();
        }
              
    }

    //Mocha类  代码

    public class Mocha extends CondimentDecorator {
       Beverage beverage;
    
        public Mocha(Beverage beverage){
            this.beverage = beverage; //beverage =soy;
        }
        @Override
        public String getDescription() {         
            return beverage.getDescription() +" , Mocha";        
        }
        public double cost(){
            System.out.println("Mocha cost"+" "+beverage.toString());
            return 0.20+beverage.cost();
        }
              
    }

    //DarkRost

    public class DarkRoast extends Beverage {
        public DarkRoast(){
             description  = "DarkRoast";
        }
        public double cost() {
            System.out.println("DarRoast cost");
            return 0.99;
        }
    }

    //Main

    public class StarbuzzCoffee {
    
        public static void main(String[] args) {
            Beverage beverage = new DarkRoast();
            //就是来搞明白怎么回事。
            beverage = new Whip(beverage);
            beverage = new Soy(beverage);
            beverage = new Mocha(beverage);
            
           System.out.println(beverage.cost()+"  "+beverage.getDescription());
        }
    
    }

    然后再运行调试的时候注意到了

    public Mocha(Beverage beverage){
            this.beverage = beverage; //beverage =soy;
        }

    Mocha会存储上一个beverage对象。

    在能用到的部分cost()方法都加上了 beverage.toString(),用来看看beverage对象名称。

    输出结果:

    Mocha cost 配料包.Soy@15db9742
    Soy cost 配料包.Whip@6d06d69c
    Whip post 饮料包.DarkRoast@7852e922
    DarkRoast cost
    1.44 DarkRoast , Whip , Soy , Mocha

    在调用beverage.cost时。

             会去调用Mocha.cost方法,但是Mocha存储的beverage为Soy。然后Soy里存储的beverage为whip,一次类推。直到调用DarkRoast.cost方法。

    这样就像装饰一样,从外面一层一层的添加包装。然后记录次里面的包装对象。在调用时,从外向内依次调用。

    很简单的小问题,可惜在看书的时候没有转过弯来~

    对外扩展开发,对修改关闭

    Java I/O流也是大量使用了该模式,如下:

    FileOutputStream fos  =   new  FileOutputStream( " dos.txt " );   //  获得写入文件功能 
     BufferedOutputStream bos  =   new  BufferedOutputStream(fos);  //  获得缓冲功能   

    DataOutputStream dos  =   new  DataOutputStream(bos);   //  获得写入基本类型功能

  • 相关阅读:
    初次学习Vue,输出Hello Vue!
    js的let语句在安卓手机端的QQ浏览器出错的问题
    前端框架的对比
    Vue环境搭建及node安装过程整理
    快速排序与冒泡排序(面试题)
    判断一个字符串中出现次数最多的字符并统计其出现的次数(面试题)
    Go_18: Golang 中三种读取文件发放性能对比
    GO_05_2:Golang 中 panic、recover、defer 的用法
    Go_17:GoLang中如何使用多参数属性传参
    Go_16:GoLang中flag标签使用
  • 原文地址:https://www.cnblogs.com/yuhanghzsd/p/5364836.html
Copyright © 2020-2023  润新知