目录

说明

目标

实现方式

应用场景

其他链接


说明

  • 结构型模式之一,其他还有适配器模式、桥接模式、组合模式、外观模式、享元模式、代理模式
  • 装饰者模式(Decorator Pattern)的精髓在于动态的给对象增减功能

目标

动态添加装饰,可重复装饰,直至满足要求


实现方式

说又是这家咖啡店。为了迎合顾客的口味,店里的咖啡有很多种料可以添加。不仅如此,刁钻的顾客还要先加奶后加糖,或者先加糖后加奶等要求。那没办法,生意还是得做呀。除了多种料的不同组合,还需要能按顺序添加。这就需要用装饰模式了。先生成杯原味咖啡,再按要求去添加即可:

/*** 装饰者模式(咖啡有的要加糖,有的要加奶,有的先加奶再加糖...)* <p>* 当你需要原味咖啡时那就生成原味咖啡的对象,而当你需要加奶咖啡时,仅仅需要将原味咖啡对象传递到加奶装饰者中去装饰一下就好了。* 如果你加了奶还想加糖,那就把加了奶的咖啡对象丢到加糖装饰者类中去装饰一下,一个先加奶后加糖的咖啡对象就出来了。** @author ZRH* @version 1.0.0* @date 2020/7/22*/
public class Decorator {public static void main(String[] args) {//原味咖啡ICoffee coffee = new OriginalCoffee();coffee.makeCoffee();System.out.println("");//加奶的咖啡coffee = new MilkDecorator(coffee);coffee.makeCoffee();System.out.println("");//先加奶后加糖的咖啡coffee = new SugarDecorator(coffee);coffee.makeCoffee();}
}/*** 第一步:先声明一个原始对象的接口* <p>** @author ZRH* @version 1.0.0* @date 2020-07-22*/
interface ICoffee {/*** 制作咖啡,具体给实现类搞* <p>** @throws* @author : ZRH* @version : 1.0.0* @date : 2020-07-22*/void makeCoffee();
}/*** 第二步:构建我们的原始对象,此处为原味咖啡对象,它实现了ICoffee接口。* <p>** @author ZRH* @version 1.0.0* @date 2020-07-22*/
class OriginalCoffee implements ICoffee {@Overridepublic void makeCoffee() {System.out.print("原味咖啡 ");}
}/*** 第三步:构建装饰者抽象基类,它要实现与原始对象相同的接口ICoffee,其内部持有一个ICoffee类型的引用,用来接收被装饰的对象* <p>** @author ZRH* @version 1.0.0* @date 2020-07-22*/
abstract class CoffeeDecorator implements ICoffee {private ICoffee coffee;public CoffeeDecorator(ICoffee coffee) {this.coffee = coffee;}@Overridepublic void makeCoffee() {coffee.makeCoffee();}
}/*** 第四步:构建各种装饰者类,他们都继承至装饰者基类 CoffeeDecorator。此处生成了两个,一个是加奶的装饰者,另一个是加糖的装饰者。* <p>** @author ZRH* @version 1.0.0* @date 2020-07-22*/
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(ICoffee coffee) {super(coffee);}@Overridepublic void makeCoffee() {super.makeCoffee();addMilk();}private void addMilk() {System.out.print("加奶 ");}
}class SugarDecorator extends CoffeeDecorator {public SugarDecorator(ICoffee coffee) {super(coffee);}@Overridepublic void makeCoffee() {super.makeCoffee();addSugar();}private void addSugar() {System.out.print("加糖");}
}

这样,当你需要原味咖啡时那就生成原味咖啡的对象,而当你需要加奶咖啡时,仅仅需要将原味咖啡对象传递到加奶装饰者中去装饰一下就好了。如果你加了奶还想加糖,那就把加了奶的咖啡对象丢到加糖装饰者类中去装饰一下,一个先加奶后加糖的咖啡对象就出来了 。


应用场景

  • 需要在运行时动态的给一个对象增加额外的职责时候
  • 需要给一个现有的类增加职责,但是又不想通过继承的方式来实现的时候(应该优先使用组合而非继承),或者通过继承的方式不现实的时候(可能由于排列组合产生类爆炸的问题)

其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

【Java设计模式】其他模式~

【Java设计模式】简单学装饰模式——来杯咖啡,先糖后奶相关推荐

  1. 15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡

    15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡 public static void main(String args[]){int count = 100/15; ...

  2. Java咖啡馆(2)——第一杯咖啡

    序言 2004年4月2日,微软和Sun公司突然宣布,微软以19.5亿美元的代价与Sun化干戈为玉帛,以平息Sun公司针对微软的反托拉斯诉讼和专利诉求.同时,还与Sun公司达成一项期限长达10年的协议, ...

  3. JAVA设计模式 之九 装饰模式

    装饰模式(装饰设计模式)详解 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相片加相框等. 在软件开发过程中,有时想用一些现存的组件.这些组件可能只是完成了一些核心功能.但在不 ...

  4. 轻松看懂java设计模式简单工厂模式

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

  5. Java设计模式 -- 简单工厂模式(SimpleFactory)

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...

  6. JAVA设计模式--简单介绍

    2019独角兽企业重金招聘Python工程师标准>>> 一.简介 Design pattern 是众多软件开发人员经过漫长的试验和错误总结出来的在软件开发过程中面临一般问题的解决方 ...

  7. java设计模式--简单工厂模式

    1.概念:建立一个工厂(一个函数或一个类方法)来制造新的对象,简单工厂模式静态工厂方法模式,存在的目的很简单:定义一个用于创建对象的接口. (注意点:简单工厂模式的方法是静态的) 2.组成: 1) 工 ...

  8. java设计模式--简单工厂设计模式SimpleFactoryPattern

    简单工厂模式     简单工程模式又称静态工厂方法,它的核心是类中包含一个静态方法,该方法用于根据参数来决定返回实现    同一接口不同类的实例. public class SimpleFactory ...

  9. Java——设计模式(简单工厂模式)

    * A:简单工厂模式概述* 简单工厂模式又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例* B:优点* 客户端不需要再负责对象的创建,从而明确了各个类的职责* 简单来说,客户端你只需 ...

最新文章

  1. 使用C#格式化字符串
  2. bicq php,BICQ v2.0.0
  3. python交互模式切换_Python 交互式窗口 (REPL) - Visual Studio | Microsoft Docs
  4. java面试题十八 switch一个考题
  5. OSI七层网络模型与TCP/IP五层网络模型
  6. 一文梳理JavaScript中常见的七大继承方案
  7. 13c语言中的文件是一种流式文件,读写时均以字符为单位.,C语言判断题部分.doc...
  8. 开源项目如何挣钱? Spark 商业化公司创始人曝光心路历程
  9. LCA问题——倍增算法,Tarjan算法讲解
  10. 第四章 《无冬之夜》
  11. centos7修复libcrypto.so.10缺失的问题,导致ssh无法运行
  12. 简易的NTC-10K-3950测温
  13. 北京16个山水美景| 清明小长假走起吧!
  14. html div浏览器居中显示,IE浏览器DIV居中实现方法
  15. python中什么是迭代?
  16. ECAMScript6基础知识
  17. 【20220207】【信号处理】三次样条插值原理详解
  18. Win10系统自定义开机启动项
  19. gstreamer+qgc+aarch64
  20. easyui label 编辑_EasyUI datagrid 行编辑

热门文章

  1. linux学习好的网站
  2. Mac上安装flink笔记
  3. 闵帆老师《论文写作》课学习心得
  4. MTK 平台获取IMSI号码 以及如何截获系统中的各种消息
  5. 计算机软故障分为哪几种,计算机常见故障可分为硬件和软件故障,具体介绍
  6. CPU主频越高越好吗?
  7. EAUML日拱一卒-微信小程序实战:位置闹铃 (5)-显示所在位置的信息
  8. 将计算机系成绩置零,实验三数据更新操作_计算机软件及应用_IT计算机_专业资料...
  9. ap计算机基础知识讲解,AP计算机课程与考试解读
  10. Java中的静态方法为什么不能调用非静态方法