• 设计模式真香笔记-装饰者模式


    装饰者模式的介绍

    装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
    实际中的装饰者模式的例子:比如 java.io包的实现

    装配者模式通用的UML类图

    在这里插入图片描述

    利用到的新原则

    • 类应该对扩展开放,对修改关闭

    饮料和配料的例子

    例子里面cost()的图形理解
    在这里插入图片描述

    • Beverage(抽象抽象的组件类)
    public abstract class Beverage {
        String description = "Unknown description";
    
        public String getDescription() {
            return description;
        }
        public abstract double cost();
    }
    
    • CondimentDecorator(调料共同实现的接口 抽象类)
    public abstract class CondimentDecorator extends Beverage {//调料抽象类
            @Override
            public abstract String getDescription();
    }
    
    • Espresso(具体饮料类 被装饰者继承Beverage抽象类)
    public class Espresso extends  Beverage {
    
        public Espresso(){
            description = "beverage.Espresso";
        }
    
        @Override
        public double cost() {
            return 1.99;
        }
          }
    
    
    • HouseBlend (具体饮料类 被装饰者继承Beverage抽象类)
    public class HouseBlend extends Beverage {
            public HouseBlend(){
                description = "House Blend Coffee";
            }
        @Override
        public double cost() {
            return 0.89;
        }
    }
    
    • DarkRoast (具体饮料类 被装饰者继承Beverage抽象类)
    public class DarkRoast extends Beverage {
    
            public DarkRoast(){
                description = "beverage.DarkRoast Coffee";
            }
        @Override
        public double cost() {
            return 0.99;
        }
    }
    
    • Mocha(具体调味类 装饰者继承CondimentDecorator装饰者抽象类)
    public class Mocha extends CondimentDecorator {//具体装饰者
         Beverage beverage;
         public Mocha(Beverage beverage){
             this.beverage = beverage;
         }
        @Override
        public String getDescription() {
            return beverage.getDescription()+",beverage.Mocha";
        }
    
        @Override
        public double cost() {
            return 0.2+beverage.cost();
        }
    }
    
    • Soy(具体调味类 装饰者继承CondimentDecorator装饰者抽象类)
    public class Soy extends CondimentDecorator {
        Beverage beverage;
        public Soy(Beverage beverage){
            this.beverage = beverage;
        }
        @Override
        public String getDescription() {
            return beverage.getDescription()+",beverage.Soy";
        }
    
        @Override
        public double cost() {
            return 0.14+beverage.cost();
        }
    }
    
    • Providecoffee测试类(具体如何通过装饰者模式实现饮料的配料添加和价格的计算)
    public class Providecoffee {//测试类
    
        public static void main(String[] args) {
            Beverage beverage = new Espresso();
            System.out.println(beverage.getDescription()+"   "+beverage.cost()+"¥");
    
            Beverage darkRoast = new DarkRoast();//制造出一个饮料对象
            darkRoast = new Mocha(darkRoast);//用mocha调料装饰饮料对象
            darkRoast = new Mocha(darkRoast);//再用mocha调料装饰饮料的对象
            darkRoast = new Soy(darkRoast);//最后再用soy调料装饰饮料的对象
            System.out.println(darkRoast.getDescription()+"   "+darkRoast.cost()+"¥");//暗含者递归的思想打印饮料的添加和价格
    
        }
    }
    

    装饰者模式的总结

    • 继承是一种扩展形式,但不是一定是最佳的方案。
    • 装饰者模式可以进行扩展
    • 装饰者模式意味着一群装饰者包装具体的组件
    • 装饰者会导致设计中出现许多小对象,太多了的话会让程序变得很复杂。

    本文参考 :《Head First 设计模式》

  • 相关阅读:
    angularjs 每隔5秒重新加载一次数据
    博客已搬家
    Essential 安装备忘录
    安卓手机添加系统证书方法
    Linux 中的硬链接和符号链接
    最适合练习英语听力的15个网站
    Linux 中的文件权限
    EROFS vs F2FS vs Btrfs vs reiserFS vs EXT4 性能比对
    宇宙六种生命形态,碳基生命排第三,排名第一的硅基生命多可怕?
    什么是爬虫脑
  • 原文地址:https://www.cnblogs.com/narojay/p/10812598.html
Copyright © 2020-2023  润新知