结构设计模式 - 装饰设计模式

装饰器设计模式用于在运行时修改对象的功能。同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为。装饰器设计模式是结构设计模式之一(如Adapter Pattern,Bridge Pattern,Composite Pattern),并使用抽象类或接口与组合来实现。

目录[ 隐藏 ]

  • 1装饰设计模式
  • 2装饰设计模式 - 类图
    • 2.1装饰设计模式测试程序
    • 2.2装饰设计模式 - 重点

我们使用继承或组合来扩展对象的行为,但这是在编译时完成的,它适用于类的所有实例。我们无法在运行时添加任何删除任何现有行为的新功能 - 这就是Decorator模式出现的时候。

假设我们想要实现不同种类的汽车 - 我们可以创建界面Car来定义组装方法然后我们可以拥有一辆Basic汽车,我们还可以将它扩展到跑车和豪华轿车。实现层次结构将如下图所示。

但是如果我们想要在运行时获得具有跑车和豪华车功能的汽车,那么实施变得复杂,如果我们想要指定哪些功能应该首先添加,它会变得更加复杂。现在想象一下,如果我们有十种不同类型的汽车,使用继承和组合的实现逻辑将无法管理。为了解决这种编程情况,我们在java中应用装饰器模式。

我们需要有以下类型来实现装饰器设计模式。

  1. 组件接口 - 定义将要实现的方法的接口或抽象类。在我们的例子Car中将是组件接口。

    
    package com.journaldev.design.decorator;public interface Car {public void assemble();
    }
    
  2. 组件实现 - 组件接口的基本实现。我们可以将BasicCar类作为组件实现。
    
    package com.journaldev.design.decorator;public class BasicCar implements Car {@Overridepublic void assemble() {System.out.print("Basic Car.");}}
    
  3. 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();}}
    
  4. Concrete Decorators - 扩展基本装饰器功能并相应地修改组件行为。我们可以将具体的装饰器类作为LuxuryCarSportsCar
    
    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等。

结构设计模式 - 装饰器设计模式相关推荐

  1. 学习笔记:设计模式-装饰器设计模式(JAVA)

    概念 装饰器设计模式,也叫包装设计模式,他是作为现有类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构. 给对象添加功能,一般两种方式,继承或者组合,将一个类的对象嵌入到另一个对象中, ...

  2. 装饰着模式示例_装饰器设计模式示例

    装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...

  3. 用装饰器设计模式装饰

    装饰图案是广泛使用的结构图案之一. 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能. 简而言之,此模式通过包装将附加功能添加到对象. 问题陈述: 想像一下我们有一个比萨饼,该比萨饼已经用番 ...

  4. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  5. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  6. lambda设计模式_使用lambda的装饰器设计模式

    lambda设计模式 随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码. 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能. 展望未来,我认为下一步是 ...

  7. Java中的装饰器设计模式

    装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模式的UML表示开始: Con ...

  8. java 设计模式 示例_Java示例中的装饰器设计模式

    java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...

  9. 装饰器设计模式的应用

    嗨,您好! 今天,我将展示装饰设计模式的实际应用. 装饰器设计模式是一种广泛使用的设计模式,同时在运行期间处理图形,树木和动态更改. 如果您正在寻找或尝试进行递归,这也是一个不错的选择. 我喜欢它. ...

最新文章

  1. 总结网络执法官,p2p终结者等网管软件使用arp欺骗的防范方法
  2. CSS3蓝色宽屏二级下拉菜单DEMO演示
  3. python中矩阵的表示方法_关于Python表示矩阵的方法详解
  4. python创意编程比赛-报名了!2019年全国青少年创意编程与智能设计大赛报名开始了...
  5. 索引节点(inode)爆满问题处理
  6. 数据包接收系列 — IP协议处理流程(一)
  7. 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
  8. 膜拜大佬!5年经验Android程序员面试27天,高级面试题+解析
  9. procyon java8_java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介
  10. ubuntu 16.04 安装samba
  11. 框架学习之Spring 第四节 Spring集成JDBC组件开发
  12. 整理最全的Java笔试题库之问答题篇-国企笔试题库
  13. js 提取行间事件和多个标签 实现checkbook的全选、不选和反选
  14. 从小白开始教你怎样在Eclipse中使用Git(番外) - 各种图标的含义
  15. 5GC 网元AMF、SMF、AUSF、UPF、PCF、UDM、NRF、NSSF、NEF介绍
  16. 阿里云数据库设置ip白名单连接正式库详细步骤
  17. 绝对不可错过的圣诞节H5游戏
  18. VMware vCenter Server远程代码执行漏洞复现 CVE-2021-21972
  19. Visio绘制网络模型
  20. 计算机发展的各个阶段是以什么作为标志的,计算机发展的各个阶段是以什么作为标志的?...

热门文章

  1. 比较两种php调用Java对象的方法
  2. 动态规划——最长公共子序列(算法设计课题)
  3. Linux——批量查找替换方法(VIM和sed)
  4. js继承实现 狗类继承动物类
  5. mysql 5 安装过程
  6. 文件字节输入流 java
  7. 9206 1225 mybank系统 随堂笔记
  8. 掌握基于switch语句的流程控制测试分析 1221
  9. 消息框messagebox的使用
  10. django-阻止某一个IP访问某一个页面