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

简介: 设计模式-结构型模式:装饰模式

1、简介

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许动态地向对象添加额外的职责,同时又不会影响到从这个对象派生出的其他对象

装饰模式的目的是在不改变对象自身的基础上,在程序运行期间给对象动态地添加职责。装饰模式主要解决了继承关系过于复杂的问题,通过将一个类的核心职责与装饰功能分离,可以把不同的装饰类和核心类组合起来,得到不同的组合结果,从而避免继承关系的复杂性。

2、组成部分

装饰模式包括四个角色:

  • 抽象构件(Component):定义了一个抽象接口,可以给这些对象动态地添加职责。
  • 具体构件(ConcreteComponent):实现了抽象构件接口,定义了一个具体的对象,可以给这个对象添加一些职责
  • 抽象装饰器(Decorator):继承了抽象构件,并包含了一个具体构件对象,同时也包含了一个抽象构件类型的指针,这个指针可以指向另一个抽象构件类型的对象,从而可以对另一个对象进行装饰。
  • 具体装饰器(ConcreteDecorator):实现了抽象装饰器接口,向对象添加一些职责。

3、优缺点

优点:

  1. 装饰模式可以动态地为对象添加额外的功能,而不需要修改对象本身或创建一个子类来扩展对象的功能。
  2. 装饰模式将功能分离到不同的类中,使得每个类的代码更加简洁和易于维护。
  3. 装饰模式可以动态地组合对象,而不需要在编译时确定对象的组合方式,这使得系统更加灵活。
  4. 装饰模式符合开闭原则,因为它允许向一个对象添加新的功能,而不需要修改现有的代码

缺点:

  1. 使用装饰模式可能会导致系统中出现大量的小类,这可能会导致代码复杂度增加。
  2. 如果装饰器类的层次结构很深,那么调试和维护可能会变得困难。
  3. 装饰模式需要额外的开销,因为需要创建额外的对象来实现装饰器的功能,这可能会影响系统的性能。

总之,装饰模式是一种有用的设计模式,可以提高代码的灵活性和可重用性,但在使用时需要权衡其优缺点,并考虑实际情况来选择最合适的解决方案。

4、使用场景

装饰模式是一种常用的设计模式,在许多应用中都有使用。下面介绍一些装饰模式的使用场景:

  1. 动态地为对象添加功能:装饰模式最常见的应用场景是在运行时动态地为一个对象添加额外的功能,而不会影响到其他对象。

例如,一个文本编辑器可以使用装饰模式来添加各种不同的格式,如加粗、斜体、下划线等,而不需要修改原来的文本内容。在这种情况下,可以创建一个基本的文本对象,然后使用装饰器来为该对象添加不同的格式。

  1. 避免在一个类中实现所有功能:当一个类需要实现所有可能需要的功能时,代码可能会变得冗长和难以维护。使用装饰模式可以将不同的功能分离到不同的类中,这样每个类的代码会更加简洁和易于维护。

例如,在一个 GUI 应用程序中,可以使用装饰模式来为窗口添加不同的组件,如按钮、文本框、下拉菜单等,而不需要在一个类中实现所有这些组件的功能。

  1. 动态地组合对象:装饰模式可以在运行时动态地组合对象,而不需要在编译时确定对象的组合方式。这使得系统更加灵活,可以根据需要组合不同的对象来实现不同的功能。

例如,在一个游戏中,可以使用装饰模式来为玩家添加不同的装备,如武器、护甲、饰品等,而不需要为每个玩家创建一个不同的子类。

  1. 需要扩展现有的类而不想修改代码:有时候,我们需要扩展一个已经存在的类,但不想修改这个类的源代码,因为这可能会影响到其他代码。在这种情况下,可以使用装饰模式来扩展该类的功能。

例如,在一个订单管理系统中,可以使用装饰模式来为订单添加不同的功能,如优惠券、礼品卡等,而不需要修改订单类的源代码。

总之,装饰模式适用于需要动态地为对象添加功能、避免在一个类中实现所有功能、动态地组合对象以及需要扩展现有的类而不想修改代码的情况。

5、代码实现

构建目录如下:

①定义抽象构件(Component):定义了抽象接口类shape->形状类

②定义具体构件(ConcreteComponent):定义了具体构件类Rectangle->矩形类

③定义抽象装饰器(Decorator):定义抽象类ShapeDecorator,实现了shape形状接口,可以动态给这个对象添加一些职责。

④定义具体装饰器(ConcreteDecorator):定义具体实现类BlueShapeDecorator和RedShapeDecorator,都实现了抽象装饰器接口ShapeDecorator,二者异曲同工,此处仅对一个实现类进行说明。

⑤模拟客户端调用

⑥输出结果:

⑦输出原理分析图

⑧对demo的总结

对于装饰模式的代码样例实现,不难发现,装饰模式最大的有点在于它可以动态的删除或添加对象的功能,而不会影响到其他具体对象。

装饰模式还避免了在一个类中实现所有功能的问题,这样可以使类的代码更加简洁和易于维护,易于解耦

相关文章
|
9月前
|
设计模式 存储 缓存
【设计模式】【结构型模式】享元模式(Flyweight)
一、入门 什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的情况。 它的核心思想是将对象的内在状态(不变
317 16
|
9月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】代理模式(Proxy)
一、入门 什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,允许你提供一个代理对象来控制对另一个对象的访问。 代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对
274 10
|
9月前
|
设计模式 Java 定位技术
【设计模式】【结构型模式】组合模式(Composite)
一、入门 什么是组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和组合对
296 10
|
9月前
|
关系型数据库 Java MySQL
【设计模式】【结构型模式】桥接模式(Bridge)
一、入门 什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,让它们可以独立变化。简单来说,它像一座“桥”连接了两个维度的变化,避免用继承导致代
471 10
|
9月前
|
设计模式 前端开发 Java
【设计模式】【结构型模式】适配器模式(Adpter)
一、入门 什么是适配器模式? 适配器模式是Java中常用的结构型设计模式,它的核心作用就像现实中的电源转换器一样---让原本不兼容的两个接口能够协同工作。 为什么要用适配器模式? 假设我们需要在电商系
240 10
|
9月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】外观模式(Facde)
一、入门 什么是外观模式? 一种结构型设计模式,通过为子系统中的一组接口提供一个统一的高层接口(称为外观),来简化客户端与复杂子系统的交互过程。其本质是建立抽象层来隔离复杂度。 为什么要有外观模式?
365 9
|
9月前
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
236 8
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)