java培训 | Java设计模式之装饰者设计模式
星巴克咖啡订单项目
星巴克咖啡订单项目(咖啡馆):
1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)
2) 调料:Milk、Soy(豆浆)、Chocolate
3) 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
4) 使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。
方案1-解决星巴克咖啡订单项目
方案1-较差的方案
更多Java –大数据 – 前端 – UI/UE - Android - 人工智能资料下载,可访问百度:尚硅谷官网(www.atguigu.com)
方案1-解决星巴克咖啡订单问题分析
1) Drink 是一个抽象类,表示饮料
2) des就是对咖啡的描述, 比如咖啡的名字
3) cost() 方法就是计算费用,Drink 类中做成一个抽象方法.
4) Decaf 就是单品咖啡, 继承Drink, 并实现cost
5) Espress && Milk 就是单品咖啡+调料, 这个组合很多
6) 问题:这样设计,会有很多类,当我们增加一个单品咖啡,或者一个新的调料,类的数量就会倍增,就会出现类爆炸
方案2-解决星巴克咖啡订单
方案2-解决星巴克咖啡订单(好点)
前面分析到方案1因为咖啡单品+调料组合会造成类的倍增,因此可以做改进,将调料内置到Drink类,这样就不会造成类数量过多。从而提高项目的维护性(如图)
说明: milk,soy,chocolate 可以设计为Boolean,表示是否要添加相应的调料.
方案2-解决星巴克咖啡订单问题分析
方案2-的问题分析
1) 方案2可以控制类的数量,不至于造成很多的类
2) 在增加或者删除调料种类时,代码的维护量很大
3) 考虑到用户可以添加多份 调料时,可以将hasMilk 返回一个对应int
4) 考虑使用 装饰者 模式
更多Java –大数据 – 前端 – UI/UE - Android - 人工智能资料下载,可访问百度:尚硅谷官网(www.atguigu.com)
装饰者模式
定义
1) 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)_java培训
2) 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。
原理
1) 装饰者模式就像打包一个快递
- 主体:比如:陶瓷、衣服 (Component) // 被装饰者
- 包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator)
2) Component
主体:比如类似前面的Drink
3) ConcreteComponent和Decorator
ConcreteComponent:具体的主体,比如前面的各个单品咖啡
Decorator: 装饰者,比如各调料.
4) 在如图的Component与ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类。
装饰者模式解决星巴克咖啡订单
用装饰者模式设计的方案
说明
1) Drink 类就是前面说的抽象类, Component
2) ShortBlack 就单品咖啡
3) Decorator 是一个装饰类,含有一个被装饰的对象(Drink obj)
4) Decorator 的cost 方法 进行一个费用的叠加计算,递归的计算价格_java视频
装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack
说明
1) Milk包含了LongBlack
2) 一份Chocolate包含了(Milk+LongBlack)
3) 一份Chocolate包含了(Chocolate+Milk+LongBlack)
4) 这样不管是什么形式的单品咖啡+调料组合,通过递归方式可以方便的组合和维护。
装饰者模式咖啡订单项目应用实例
咖啡订单项目包结构
装饰者模式在JDK应用的源码分析
Java的IO结构,FilterInputStream就是一个装饰者
java培训 | Java设计模式之装饰者设计模式相关推荐
- 西安Java培训 | java设计模式之工厂设计模式
简单工厂模式 看一个具体的需求 看一个披萨的项目:要便于披萨种类的扩展,要便于维护 1) 披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2) 披萨的制作有 prepare,ba ...
- 北京Java培训 | java设计模式之原型模式
克隆羊问题 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom羊 属性完全相同的10只羊. 传统方式解决克隆羊问题 传统的方式的优缺点 1) 优点是比较好理解,简 ...
- 初学Java常用设计模式之——装饰器模式
声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...
- 结构设计模式 - 装饰器设计模式
结构设计模式 - 装饰设计模式 装饰器设计模式用于在运行时修改对象的功能.同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为.装饰器设计模式是结构设计模式之一(如Adapter Pat ...
- java基本数据类型线程,西安莲湖区java培训哪里好(Java基本数据类型)
西安莲湖区java培训哪里好,是否对它不太理解,那么西安Java培训会竭尽一切带你了解Java基本数据类型,Java的数据类型,java安全性,java多线程性. Java基本数据类型 Java数据类 ...
- 装饰者设计模式(结构型设计模式)
一.装饰者设计模式简介 装饰器设计模式(Decorator Pattern) 也叫包装设计模式,属于结构型模式,它是作为现有的类的⼀个包装,允许向⼀个现有的对象添加新的功能, 同时⼜不改变其结构给对象 ...
- 深圳php和java,深圳java技术培训学习(Java和PHP区别)
深圳java技术培训学习,深圳Java培训已经越来越普及了,通过Java和PHP区别,Java语言的分布性,Java语言的稳健性我们可以了解的更清楚些. Java和PHP区别 Java和PHP都是编程 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- java设计模式之装饰模式_Java中的装饰器设计模式
java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...
最新文章
- R获取股票数据并进行进行可视化分析
- 算法与数据结构(python):递归
- where 1=1和 0=1 的作用
- Unity使用独立配置文件的方法
- 微信小程序循环不同列表实现动态点击隐藏
- 什么是通信卫星有效载荷(payload)
- UART/I2C/SPI/1-wire四大通信接口的神解释
- android 水平进度条 自定义颜色,android 水平进度条的颜色设置
- JavaWeb -- Struts1 多文件上传与下载 DownloadAction, DispatchAction
- java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)
- 软件工程第一次测试——学生管理系统设计
- Linux 网络配置 修改DNS配置文件/etc/resolv.conf后,重启网络,DNS配置丢失
- MFC 单文档、多文档和对话框
- NVivo的节点矩阵
- Windows网络编程之Socket高级编程简介
- python画立体温度分布图_Origin绘制3D立体温度分布图的方法
- ActivityManager解析及使用
- t-SNE原理及代码
- 基于Cocos2d-x游戏引擎实战开发炸弹超人
- 区分QA和QC, Verification和Validation
热门文章
- jp@gc - PerfMon Metrics Collector:服务器性能监测控件
- speedoffice(Excel)表格中文字如何修方向
- Educational Codeforces Round 132 (Rated for Div. 2) C,D+AC自动机
- java遍历多层map_Java遍历Map对象的四种方式
- 计算机动画_3dmax的使用(六)
- 如何恢复被删短信_苹果手机已删除的短信怎么恢复?分享几种简单的恢复方法...
- 工业用微型计算机 ppt,工业用微型计算机1章.ppt
- java登录代码带验证码实现_两种方法实现带验证码的用户登录
- 怎样简洁明了地说清楚产品需求?
- 罗技键盘+android风格,罗技推新款便携无线键盘 手感类似传统键盘