装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

装饰(Decorator)模式的使用场景:

  • 需要扩展一个类的功能,或给一个类增加附加责任。
  • 需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
  • 需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得    不现实。

装饰(Decorator)模式的主要优点有:

  • 采用装饰模式扩展对象的功能比采用继承方式更加灵活。
  • 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。

其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。

装饰(Decorator)模式的结构

装饰模式主要包含以下角色:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(Concrete    Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰模式的结构图如下所示


                                    装饰模式的结构图

举例说明:

咖啡是一种饮料,咖啡的本质是咖啡豆+水磨出来的。咖啡店现在要卖各种口味的咖啡,如果不使用装饰模式,那么在销售系统中,各种不一样的咖啡都要产生一个类,如果有4中咖啡豆,5种口味,那么将要产生至少20个类(不包括混合口味),非常麻烦。使用了装饰模式,只需要11个类即可生产任意口味咖啡(包括混合口味)。

类图

Beverage饮料接口

/*** 饮料接口* @author Administrator**/
public interface Beverage {//返回商品描述public String getDescription();//返回价格public double getPrice();
}

CoffeeBean1——具体被装饰的对象类1

public class CoffeeBean1 implements Beverage {private String description = "选了第一种咖啡豆";@Overridepublic String getDescription() {return description;}@Overridepublic double getPrice() {return 50;}}

CoffeeBean2——具体被装饰的对象类2

public class CoffeeBean2 implements Beverage {private String description = "第二种咖啡豆!";@Overridepublic String getDescription() {return description;}@Overridepublic double getPrice() {return 100;}}

Decorator——装饰类

public class Decorator implements Beverage {private String description = "我只是装饰器,不知道具体的描述";@Overridepublic String getDescription() {return description;}@Overridepublic double getPrice() {return 0;     //价格由子类来决定}}

Milk——具体装饰类,给咖啡加入牛奶

public class Milk extends Decorator{private String description = "加了牛奶!";private Beverage beverage = null;public Milk(Beverage beverage){this.beverage = beverage;}public String getDescription(){return beverage.getDescription()+"\n"+description;}public double getPrice(){return beverage.getPrice()+20;    //20表示牛奶的价格}
}

Mocha——给咖啡加入摩卡

public class Mocha extends Decorator {private String description = "加了摩卡!";private Beverage beverage = null;public Mocha(Beverage beverage){this.beverage = beverage;}public String getDescription(){return beverage.getDescription()+"\n"+description;}public double getPrice(){return beverage.getPrice()+49; //30表示摩卡的价格}
}

Soy——给咖啡加入豆浆

public class Soy extends Decorator {private String description = "加了豆浆!";private Beverage beverage = null;public Soy(Beverage beverage){this.beverage = beverage;}public String getDescription(){return beverage.getDescription()+"\n"+description;}public double getPrice(){return beverage.getPrice()+30; //30表示豆浆的价格}
}

测试类:

public class Test {public static void main(String[] args) {Beverage beverage = new CoffeeBean1();   //选择了第一种咖啡豆磨制的咖啡beverage = new Mocha(beverage);        //为咖啡加了摩卡beverage = new Milk(beverage);System.out.println(beverage.getDescription()+"\n加了摩卡和牛奶的咖啡价格:"+beverage.getPrice());}
}

Java 常见设计模式 - 装饰模式相关推荐

  1. ☀️一张思维图带大家了解Java常见设计模式☀️《❤️记得收藏❤️》

    ☀️一张思维图带大家了解Java常见设计模式☀️<❤️记得收藏❤️> 目录

  2. Java常见设计模式详解

    设计模式的类型 创建型模式–>对象怎么来 结构型模式–>对象和谁有关 行为型模式–>对象与对象在干什么 序号 模式 & 描述 包括 1 创建型模式 这些设计模式提供了一种在创 ...

  3. 荐:Java常见设计模式

    设计模式的原则: 1.开闭原则 对扩展开放,对修改关闭. 2.依赖倒置原则 通过抽象使各个类或者模块不相互影响,实现松耦合. 3.单一职责原则 一个类.接口.方法只做一件事. 4.接口隔离原则 尽量保 ...

  4. Java 常见设计模式

    常用的设计模式分为如下 23 种模式: Abstract Factory: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter: 将一个类的接口转换成客户希望的另一个 ...

  5. java面试常见设计模式

    java面试常见设计模式 看这里,动画描述很好 创建型模式 工厂方法模式 目的 结构 场景 优缺点 示例代码 button factory Demo.java: 客户端代码 抽象工厂模式 目的 结构 ...

  6. Java 10种常见设计模式UML图

    Java 10种常见设计模式UML图 简单工厂模式(不属于23种设计模式) 工厂方法模式 单例 模式(静态内部类方式 IODH) 适配器模式 装饰者模式 门面模式 代理模式(静态代理) 观察者模式 策 ...

  7. java常见的设计模式

    在了解java常见的设计模式之前,我们要了解三个问题, 1.为什么要了解设计模式? 2.这些设计模式的是根据什么原则来设计的? 3.有哪些常见的设计模式? 为什么要了解设计模式? 因为设计模式代表了最 ...

  8. 大话设计模式-装饰模式(大鸟和小菜Java版)

    装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...

  9. java策略设计模式_Java中的策略设计模式

    java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...

最新文章

  1. linux centos7 使用 crosstool-ng 构建 交叉编译 工具链 即构建各cpu架构平台的gcc编译器
  2. python中的正则表达式是干嘛的_操作python中的正则表达式(上)
  3. 批处理文件总结(三)
  4. access注入漏洞
  5. SpringCloud——服务网关
  6. Atitit mybatis业务流程配置化管理总结 目录 1. Mybatis 1 2. 流程模型常见的bpm模式 1 2.1. 活动task 流程,getway流程控制(分支跳转 循环等) 1 3
  7. codeblocks 汉化包+汉化教程,仅需三步
  8. openwrt 格式化_如何在路由器上格式化 U 盘、硬盘
  9. android自动调节亮度是怎么实现的,Android亮度调节的几种实现方法
  10. 在Windows系统中使用DIY Dodecad 2.1 分析祖源的方法
  11. android隐藏微信好友,如何使用微信隐藏的恢复小技巧?微信好友恢复!
  12. 新春快乐!马年大吉!518
  13. 二篇、使用excel做数据驱动把数据管理起来
  14. MES生产调度管理系统源码 MES系统源码
  15. vulnhub-FIRSTBLOOD1靶场
  16. 尝试做一个好的技术Leader, 建立“去中心化团队”
  17. Amazon Review Dataset数据集介绍
  18. POJ1324 Holedox Moving(BFS)
  19. uci数据集中的缺失数据_从uci早期糖尿病风险预测数据集中创建分类器
  20. 网管到底要学什么(一)

热门文章

  1. mysql中要创建choose数据库_在MySQL中要创建choose数据库,应该使用命令“crea
  2. YOLOv3训练自己的数据
  3. 电脑qq如何彻底删除全部信息
  4. 读入一个三位数,计算其各位数字之和。例如: 123,各位数字之和为6
  5. 一元多项式的相乘操作(链表)
  6. python目前版本强势英雄_8.18版本解析,各位置胜率TOP1,了解这个版本的强势英雄...
  7. Android hook技术实现一键换肤,移动应用开发项目案例
  8. windows密码获取
  9. html网页制作教程按钮添加,网页制作html5自定义video标签的海报与播放按钮功能...
  10. 聊天机器人-项目准备