结构设计模式 - 装饰器设计模式
结构设计模式 - 装饰设计模式
装饰器设计模式用于在运行时修改对象的功能。同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为。装饰器设计模式是结构设计模式之一(如Adapter Pattern,Bridge Pattern,Composite Pattern),并使用抽象类或接口与组合来实现。
目录[ 隐藏 ]
- 1装饰设计模式
- 2装饰设计模式 - 类图
- 2.1装饰设计模式测试程序
- 2.2装饰设计模式 - 重点
我们使用继承或组合来扩展对象的行为,但这是在编译时完成的,它适用于类的所有实例。我们无法在运行时添加任何删除任何现有行为的新功能 - 这就是Decorator模式出现的时候。
假设我们想要实现不同种类的汽车 - 我们可以创建界面Car来定义组装方法然后我们可以拥有一辆Basic汽车,我们还可以将它扩展到跑车和豪华轿车。实现层次结构将如下图所示。
但是如果我们想要在运行时获得具有跑车和豪华车功能的汽车,那么实施变得复杂,如果我们想要指定哪些功能应该首先添加,它会变得更加复杂。现在想象一下,如果我们有十种不同类型的汽车,使用继承和组合的实现逻辑将无法管理。为了解决这种编程情况,我们在java中应用装饰器模式。
我们需要有以下类型来实现装饰器设计模式。
- 组件接口 - 定义将要实现的方法的接口或抽象类。在我们的例子
Car
中将是组件接口。package com.journaldev.design.decorator;public interface Car {public void assemble(); }
- 组件实现 - 组件接口的基本实现。我们可以将
BasicCar
类作为组件实现。package com.journaldev.design.decorator;public class BasicCar implements Car {@Overridepublic void assemble() {System.out.print("Basic Car.");}}
- Decorator - Decorator类实现组件接口,它与组件接口具有HAS-A关系。组件变量应该可以被子装饰器类访问,因此我们将保护此变量。
package com.journaldev.design.decorator;public class CarDecorator implements Car {protected Car car;public CarDecorator(Car c){this.car=c;}@Overridepublic void assemble() {this.car.assemble();}}
- Concrete Decorators - 扩展基本装饰器功能并相应地修改组件行为。我们可以将具体的装饰器类作为
LuxuryCar
和SportsCar
。package com.journaldev.design.decorator;public class SportsCar extends CarDecorator {public SportsCar(Car c) {super(c);}@Overridepublic void assemble(){super.assemble();System.out.print(" Adding features of Sports Car.");} }
package com.journaldev.design.decorator;public class LuxuryCar extends CarDecorator {public LuxuryCar(Car c) {super(c);}@Overridepublic void assemble(){super.assemble();System.out.print(" Adding features of Luxury Car.");} }
装饰设计模式 - 类图
装饰设计模式测试程序
package com.journaldev.design.test;import com.journaldev.design.decorator.BasicCar;
import com.journaldev.design.decorator.Car;
import com.journaldev.design.decorator.LuxuryCar;
import com.journaldev.design.decorator.SportsCar;public class DecoratorPatternTest {public static void main(String[] args) {Car sportsCar = new SportsCar(new BasicCar());sportsCar.assemble();System.out.println("\n*****");Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));sportsLuxuryCar.assemble();}}
请注意,客户端程序可以在运行时创建不同类型的Object,它们也可以指定执行顺序。
上述测试程序的输出是:
Basic Car. Adding features of Sports Car.
***** Basic Car. Adding features of Luxury Car. Adding features of Sports Car.
装饰设计模式 - 重点
- 装饰器设计模式有助于提供运行时修改能力,因此更灵活。当选择的数量更多时,它易于维护和扩展。
- 装饰器设计模式的缺点是它使用了许多类似的对象(装饰器)。
- 装饰器模式在Java IO类中经常使用,例如FileReader,BufferedReader等。
结构设计模式 - 装饰器设计模式相关推荐
- 学习笔记:设计模式-装饰器设计模式(JAVA)
概念 装饰器设计模式,也叫包装设计模式,他是作为现有类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构. 给对象添加功能,一般两种方式,继承或者组合,将一个类的对象嵌入到另一个对象中, ...
- 装饰着模式示例_装饰器设计模式示例
装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...
- 用装饰器设计模式装饰
装饰图案是广泛使用的结构图案之一. 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能. 简而言之,此模式通过包装将附加功能添加到对象. 问题陈述: 想像一下我们有一个比萨饼,该比萨饼已经用番 ...
- Python设计模式-装饰器模式
Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...
- java设计模式之装饰模式_Java中的装饰器设计模式
java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...
- lambda设计模式_使用lambda的装饰器设计模式
lambda设计模式 随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码. 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能. 展望未来,我认为下一步是 ...
- Java中的装饰器设计模式
装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模式的UML表示开始: Con ...
- java 设计模式 示例_Java示例中的装饰器设计模式
java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...
- 装饰器设计模式的应用
嗨,您好! 今天,我将展示装饰设计模式的实际应用. 装饰器设计模式是一种广泛使用的设计模式,同时在运行期间处理图形,树木和动态更改. 如果您正在寻找或尝试进行递归,这也是一个不错的选择. 我喜欢它. ...
最新文章
- 总结网络执法官,p2p终结者等网管软件使用arp欺骗的防范方法
- CSS3蓝色宽屏二级下拉菜单DEMO演示
- python中矩阵的表示方法_关于Python表示矩阵的方法详解
- python创意编程比赛-报名了!2019年全国青少年创意编程与智能设计大赛报名开始了...
- 索引节点(inode)爆满问题处理
- 数据包接收系列 — IP协议处理流程(一)
- 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
- 膜拜大佬!5年经验Android程序员面试27天,高级面试题+解析
- procyon java8_java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介
- ubuntu 16.04 安装samba
- 框架学习之Spring 第四节 Spring集成JDBC组件开发
- 整理最全的Java笔试题库之问答题篇-国企笔试题库
- js 提取行间事件和多个标签 实现checkbook的全选、不选和反选
- 从小白开始教你怎样在Eclipse中使用Git(番外) - 各种图标的含义
- 5GC 网元AMF、SMF、AUSF、UPF、PCF、UDM、NRF、NSSF、NEF介绍
- 阿里云数据库设置ip白名单连接正式库详细步骤
- 绝对不可错过的圣诞节H5游戏
- VMware vCenter Server远程代码执行漏洞复现 CVE-2021-21972
- Visio绘制网络模型
- 计算机发展的各个阶段是以什么作为标志的,计算机发展的各个阶段是以什么作为标志的?...