Java 常见设计模式 - 装饰模式
装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰(Decorator)模式的使用场景:
- 需要扩展一个类的功能,或给一个类增加附加责任。
- 需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
- 需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得 不现实。
装饰(Decorator)模式的主要优点有:
- 采用装饰模式扩展对象的功能比采用继承方式更加灵活。
- 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。
其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。
装饰(Decorator)模式的结构
装饰模式主要包含以下角色:
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(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 常见设计模式 - 装饰模式相关推荐
- ☀️一张思维图带大家了解Java常见设计模式☀️《❤️记得收藏❤️》
☀️一张思维图带大家了解Java常见设计模式☀️<❤️记得收藏❤️> 目录
- Java常见设计模式详解
设计模式的类型 创建型模式–>对象怎么来 结构型模式–>对象和谁有关 行为型模式–>对象与对象在干什么 序号 模式 & 描述 包括 1 创建型模式 这些设计模式提供了一种在创 ...
- 荐:Java常见设计模式
设计模式的原则: 1.开闭原则 对扩展开放,对修改关闭. 2.依赖倒置原则 通过抽象使各个类或者模块不相互影响,实现松耦合. 3.单一职责原则 一个类.接口.方法只做一件事. 4.接口隔离原则 尽量保 ...
- Java 常见设计模式
常用的设计模式分为如下 23 种模式: Abstract Factory: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter: 将一个类的接口转换成客户希望的另一个 ...
- java面试常见设计模式
java面试常见设计模式 看这里,动画描述很好 创建型模式 工厂方法模式 目的 结构 场景 优缺点 示例代码 button factory Demo.java: 客户端代码 抽象工厂模式 目的 结构 ...
- Java 10种常见设计模式UML图
Java 10种常见设计模式UML图 简单工厂模式(不属于23种设计模式) 工厂方法模式 单例 模式(静态内部类方式 IODH) 适配器模式 装饰者模式 门面模式 代理模式(静态代理) 观察者模式 策 ...
- java常见的设计模式
在了解java常见的设计模式之前,我们要了解三个问题, 1.为什么要了解设计模式? 2.这些设计模式的是根据什么原则来设计的? 3.有哪些常见的设计模式? 为什么要了解设计模式? 因为设计模式代表了最 ...
- 大话设计模式-装饰模式(大鸟和小菜Java版)
装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...
- java策略设计模式_Java中的策略设计模式
java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...
最新文章
- linux centos7 使用 crosstool-ng 构建 交叉编译 工具链 即构建各cpu架构平台的gcc编译器
- python中的正则表达式是干嘛的_操作python中的正则表达式(上)
- 批处理文件总结(三)
- access注入漏洞
- SpringCloud——服务网关
- Atitit mybatis业务流程配置化管理总结 目录 1. Mybatis	1 2. 流程模型常见的bpm模式	1 2.1. 活动task 流程,getway流程控制(分支跳转 循环等)	1 3
- codeblocks 汉化包+汉化教程,仅需三步
- openwrt 格式化_如何在路由器上格式化 U 盘、硬盘
- android自动调节亮度是怎么实现的,Android亮度调节的几种实现方法
- 在Windows系统中使用DIY Dodecad 2.1 分析祖源的方法
- android隐藏微信好友,如何使用微信隐藏的恢复小技巧?微信好友恢复!
- 新春快乐!马年大吉!518
- 二篇、使用excel做数据驱动把数据管理起来
- MES生产调度管理系统源码 MES系统源码
- vulnhub-FIRSTBLOOD1靶场
- 尝试做一个好的技术Leader, 建立“去中心化团队”
- Amazon Review Dataset数据集介绍
- POJ1324 Holedox Moving(BFS)
- uci数据集中的缺失数据_从uci早期糖尿病风险预测数据集中创建分类器
- 网管到底要学什么(一)
热门文章
- mysql中要创建choose数据库_在MySQL中要创建choose数据库,应该使用命令“crea
- YOLOv3训练自己的数据
- 电脑qq如何彻底删除全部信息
- 读入一个三位数,计算其各位数字之和。例如: 123,各位数字之和为6
- 一元多项式的相乘操作(链表)
- python目前版本强势英雄_8.18版本解析,各位置胜率TOP1,了解这个版本的强势英雄...
- Android hook技术实现一键换肤,移动应用开发项目案例
- windows密码获取
- html网页制作教程按钮添加,网页制作html5自定义video标签的海报与播放按钮功能...
- 聊天机器人-项目准备