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

    定义装饰者模式

    装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。这句话摘自书中,给人读得很生硬难懂。通俗地来说,装饰者和被装饰者有相同的父类,装饰者的行为组装着被装饰者的行为。

    设计星巴克咖啡

    代码实现

    /**
     * @author Lollipop
     * @since 2019/11/26
     */
    public abstract class Beverage {
        String description = "Unknown Beverage";
    
        public String getDescription() {
            return description;
        }
    
        public abstract double cost();
    
    }
    
    /**
     * @author Lollipop
     * @since 2019/11/26
     */
    public abstract class CondimentDecorator extends Beverage {
        /**
         * 描述
         * @return
         */
     @Override
     public abstract String getDescription();
    }
    
    /**
     * @author Lollipop
     * @since 2019/11/26
     */
    public class Mocha extends CondimentDecorator {
        private Beverage beverage;
    
        public Mocha(Beverage beverage) {
            this.beverage = beverage;
        }
    
        /**
         * 描述
         *
         * @return
         */
        @Override
        public String getDescription() {
            return "Mocha," + this.beverage.getDescription();
        }
    
        @Override
        public double cost() {
            return 0.20 + this.beverage.cost();
        }
    }
    
    /**
     * @author Lollipop
     * @since 2019/11/26
     */
    public class Whip extends CondimentDecorator {
        private Beverage beverage;
    
        public Whip(Beverage beverage) {
            this.beverage = beverage;
        }
    
        /**
         * 描述
         *
         * @return
         */
        @Override
        public String getDescription() {
            return "Whip," + this.beverage.getDescription();
        }
    
        @Override
        public double cost() {
            return 0.10 + this.beverage.cost();
        }
    }
    

    代码运行

    /**
     * @author Lollipop
     * @since 2019/11/26
     */
    public class StarbuzzCoffee {
        public static void main(String[] args) {
            Beverage beverage = new Espress();
            beverage = new Mocha(beverage);
            beverage = new Mocha(beverage);
            beverage = new Whip(beverage);
            System.out.println(beverage.getDescription() + " $" + beverage.cost());
        }
    }
    

    运行结果

    Whip,Mocha,Mocha,Unknown Beverage $1.59

    总结

    1. 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
    2. 多重嵌套,导致代码复杂度高
  • 相关阅读:
    (转)R空间数据处理与可视化
    shell 脚本 exit 1 报错:numeric argument required问题解决
    如何在java中拟合正态分布
    Geometry关系高级操作
    IntelliJ IDEA 15.0.2远程debug tomcat
    jmc远程监控java服务
    Cannot assign requested address出现的原因及解决方案
    网络调试工具
    性能优化工具---sar
    性能优化工具---iostat
  • 原文地址:https://www.cnblogs.com/Lollipop_Hsu/p/11946268.html
Copyright © 2011-2022 走看看