zoukankan      html  css  js  c++  java
  • 关于装饰者模式的层层调用

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

    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);   //  获得写入基本类型功能

  • 相关阅读:
    BlockUI常见问题
    AssemblyInfo文件
    asp.net 如何让虚拟目录里面的webconfig不继承主目录config(转)
    jquery Ajax示例
    jQuery Ajax 实例 全解析 (转)
    如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件(转)
    如何使用ASP.NET2.0的“嵌入的资源”(转)
    BlockUI对话框
    Jquery ajax参数设置
    What's production quality
  • 原文地址:https://www.cnblogs.com/yuhanghzsd/p/5364836.html
Copyright © 2011-2022 走看看