• 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. 多重嵌套,导致代码复杂度高
  • 相关阅读:
    前端展示(四)
    小谢第66问:页面关闭鼠标光标
    小谢第64问:nuxt项目中增加百度分析统计
    js 判断当前是手机还是电脑
    布谷鸟自定义教程
    vs code常用插件及配置
    小程序几件小事儿
    删除 json 数据中的某一项
    小程序图片预览
    小程序 navigator 取消点击效果
  • 原文地址:https://www.cnblogs.com/Lollipop_Hsu/p/11946268.html
Copyright © 2020-2023  润新知