• “两学一做”在山西——黄河新闻网 2019-07-13
  • 内地生报读香港高校本科人数持续下跌 2019-07-13
  • 【学习时刻】人民大学王义桅:金砖合作的“自信”与“自觉” 2019-07-12
  • 女子请“私家侦探”被骗3万 警方循线捣毁诈骗团伙 2019-07-11
  • 【学习时刻】北交大马院院长韩振峰:高校思想政治工作必须牢牢把握三大根本问题 2019-07-11
  • 全国“非遗”保护工作先进名单公布 2019-07-01
  • 紫光阁中共中央国家机关工作委员会 2019-06-25
  • 杭州控烟令修改草案拟允许室内设吸烟区,控烟专家:跌破眼镜 2019-06-25
  • 挪用近30万报纸征订款赌博 河南一报社聘用制干部获刑 2019-06-23
  • 2016年,有1145家上市公司大小非减持了3600亿元,还有210名上市公司高管减持了1400亿元。IPO已成了造就成千上万个十亿、百亿富豪的捷径, 2019-06-21
  • 专家“把脉”中国电影市场:提升品质方能逆袭 2019-06-21
  • “善款资助副局长儿子留学”真相须尽快落地 2019-06-19
  • 21岁女护士失联2天后确认遇害 嫌疑人为其前男友 2019-06-19
  • 中国地质公园名录旅行地中国国家地理网 2019-06-13
  • 玄关运用有四大原则 用的好才能财旺挡煞聚财 ——凤凰网房产 2019-06-10
  • 装饰者模式.

    一、概念

    • 继承的缺点:类数量爆炸、设计死板以及基类加入的新功能可能并不适用于所有的子类。
    • 装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。一言以蔽之 —— 动态扩展类的行为。
    • 角色:
      ??1、抽象组件(Component):给出一个抽象类或接口,以规范准备接收附加责任的行为。
      ??2、具体组件(ConcreteComponent):继承或实现抽象组件,定义一个将要接收附加责任的类。
      ??3、抽象装饰者(Decorator):持有一个组件(Component)对象的实例,一般从抽象组件扩展,类型是抽象类或者接口,目的是达到"类型匹配"。
      ??4、具体装饰者(ConcreteDecorator):继承或实现抽象装饰者,负责给组件对象"贴上"附加的责任。

    二、Demo 实现

    广东十一选5一定牛 www.aavbg.com TOPIC:我们要定义一些饮品,并能够向饮品中添加一些调料,比如摩卡、糖之类的,然后能够根据添加的调料种类动态的修改饮品的价格。

    1、抽象组件

    public abstract class Beverage {
    
        String description = "Unknown Beverage";
    
        public String getDescription() {
            return description;
        }
    
        public abstract double cost();
    }

    这是一个抽象组件角色 —— 饮品抽象类,抽象方法 cost() 用来规范接收附加责任的行为。

    2、具体组件

    public class Espresso extends Beverage {
    
        public Espresso() {
            description = "Espresso";
        }
    
        @Override
        public double cost() {
            return 1.99;
        }
    }
    public class HouseBlend extends Beverage {
    
        public HouseBlend() {
            description = "HouseBlend";
        }
    
        @Override
        public double cost() {
            return 0.89;
        }
    }

    这是两个具体组件角色 —— 浓缩咖啡类和混合饮料类,用来接受附加责任,也就是装饰者具体要装饰的类!

    3、抽象装饰者

    public abstract class CondimentDecorator extends Beverage {
    
        protected Beverage beverage;
    
        @Override
        public abstract String getDescription();
    }

    这是一个抽象装饰者角色,主要的目的是为了"类型匹配",什么是"类型匹配"呢?不多说,看看下面的测试类就一目了然了!

    4、具体装饰者

    现在我们想往饮品中添加摩卡,然后在饮品的价格上添加上摩卡的价格,也就是在不改变饮品类内部代码的情况下扩展饮品类的行为 —— 用摩卡类修饰饮品类!

    public class Mocha extends CondimentDecorator {
    
        public Mocha(Beverage b) {
            beverage = b;
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + "+Mocha";
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.20;
        }
    }

    5、测试

    测试类能帮你对装饰者模式有更清晰的认识!

    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println("浓缩咖啡:" + beverage.getDescription() + "," + beverage.cost());
        
        Beverage beverage1 = new HouseBlend();
        // 抽象装饰者的 "类型匹配" 如下 —— 可以用同一个实例对象接收装饰对象,以达到类行为扩展的目的。
        beverage1 = new Mocha(beverage1);
        beverage1 = new Mocha(beverage1);
        System.out.println("混合饮料+2份摩卡:" + beverage1.getDescription() + "," + beverage1.cost());
    }

    avatar

    6、java.io 中的装饰者模式

    avatar

    演示源代码:https://github.com/JMCuixy/design-patterns

    三、总结

    • 设计原则:类应该对扩展开放,对修改关闭。
    • 事实上,在 Bertrand Meyer 第一次引入开闭原则时,原意是一旦实现后,类就不允许改动了。在现代敏捷开发环境中,完成一个类的说法很明显已经过时了。业务需求和使用方法的变化可能会让一个类的功能和当初设计的不同。当然这不成为忽视这一原则的理由,只是说明了所谓的原则只应作为指导,而不应教条地全盘接受,走向极端。
    • 特点:
      ??1、装饰者和被装饰者对象有相同的超类型。
      ??2、你可以用一个或多个装饰者包装一个对象。
      ??3、装饰者可以在所委托的被装饰者行为之前或之后,加上自己的行为,以达到特定的目的。
      ??4、对象可以在任何时候被装饰,所以你可以在运行时动态地、不限量的用你喜欢的装饰者来装饰对象。
    • 优点:装饰者模式的设计具有弹性,可以应对改变,可以接受新的功能来应对改变的需求。
    • 缺点:如果每个地方都采用开放-封闭原则是一种浪费,也没必要,还会导致代码变得复杂且难以理解。比如会产生很多的小类。
    posted @ 2018-11-14 18:04 JMCui 阅读(...) 评论(...) 编辑 收藏
  • “两学一做”在山西——黄河新闻网 2019-07-13
  • 内地生报读香港高校本科人数持续下跌 2019-07-13
  • 【学习时刻】人民大学王义桅:金砖合作的“自信”与“自觉” 2019-07-12
  • 女子请“私家侦探”被骗3万 警方循线捣毁诈骗团伙 2019-07-11
  • 【学习时刻】北交大马院院长韩振峰:高校思想政治工作必须牢牢把握三大根本问题 2019-07-11
  • 全国“非遗”保护工作先进名单公布 2019-07-01
  • 紫光阁中共中央国家机关工作委员会 2019-06-25
  • 杭州控烟令修改草案拟允许室内设吸烟区,控烟专家:跌破眼镜 2019-06-25
  • 挪用近30万报纸征订款赌博 河南一报社聘用制干部获刑 2019-06-23
  • 2016年,有1145家上市公司大小非减持了3600亿元,还有210名上市公司高管减持了1400亿元。IPO已成了造就成千上万个十亿、百亿富豪的捷径, 2019-06-21
  • 专家“把脉”中国电影市场:提升品质方能逆袭 2019-06-21
  • “善款资助副局长儿子留学”真相须尽快落地 2019-06-19
  • 21岁女护士失联2天后确认遇害 嫌疑人为其前男友 2019-06-19
  • 中国地质公园名录旅行地中国国家地理网 2019-06-13
  • 玄关运用有四大原则 用的好才能财旺挡煞聚财 ——凤凰网房产 2019-06-10
  • 东方6十1中奖规则 海南彩票七星彩开奖结果 nba投注规则 31选7开奖2019中奖规则 广西快3今天76开奖全部结果查询 山东福利彩票中心 今日河南快三开奖结果查询今天 乐天排列五17003期分析 五子棋ai算法 中彩网15298 虎扑nba比分 湖北十一选五前三直选分布走势图 中国福利彩票的刮刮乐 上海快3 电子游戏投注送二八红利