当前位置: 首页 > news >正文

小谈设计模式(7)—装饰模式

小谈设计模式(7)—装饰模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 装饰模式
    • 装饰模式角色
      • Component(抽象组件)
      • ConcreteComponent(具体组件)
      • Decorator(抽象装饰器)
      • ConcreteDecorator(具体装饰器)
    • 工作流程
      • 首先
      • 其次
      • 然后
      • 最后
    • Java代码实现
      • 代码分析
    • 优缺点分析
      • 优点
        • 符合开闭原则
        • 可以动态地添加/删除功能
        • 遵循单一职责原则
        • 装饰器类与具体组件类独立
      • 缺点
        • 可能产生过多的具体装饰器类
        • 装饰器与组件类的接口不一致
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地向一个对象添加额外的功能,而不需要修改其原始类。通过将对象包装在装饰器类中,你可以在不改变现有对象结构的情况下,逐步地添加功能。

装饰模式角色

在这里插入图片描述

Component(抽象组件)

定义了具体组件和装饰器的共同接口,可以是抽象类或接口。

ConcreteComponent(具体组件)

实现了抽象组件定义的接口,是被装饰的原始对象。

Decorator(抽象装饰器)

包含一个指向具体组件的引用,并实现了抽象组件定义的接口。

ConcreteDecorator(具体装饰器)

通过装饰器对具体组件进行扩展或修改,添加额外的功能。

在这里插入图片描述

工作流程

首先

定义一个抽象组件(Component),它声明了具体组件和装饰器共同的接口方法。

其次

创建一个具体组件(ConcreteComponent),它实现了抽象组件的接口方法,是被装饰的原始对象。

然后

创建一个抽象装饰器(Decorator),它也实现了抽象组件的接口方法,并包含一个指向具体组件的成员变量(通常为抽象组件类型),用于持有被装饰的对象。

最后

创建具体装饰器(ConcreteDecorator),它继承自抽象装饰器,并在装饰器的基础上添加了额外的功能。具体装饰器中通常会重写抽象组件的接口方法,以在调用前后进行额外的处理,然后再调用被装饰对象的相应方法。
在这里插入图片描述

Java代码实现

// Step 1: 定义抽象组件
interface Component {void operation();
}// Step 2: 创建具体组件
class ConcreteComponent implements Component {public void operation() {System.out.println("执行具体组件的操作");}
}// Step 3: 创建抽象装饰器
abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}// Step 4: 创建具体装饰器
class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {// 在调用具体组件操作前进行额外处理System.out.println("在调用具体组件操作前进行额外处理");// 调用具体组件的操作super.operation();// 在调用具体组件操作后进行额外处理System.out.println("在调用具体组件操作后进行额外处理");}
}// 使用装饰模式
public class Main {public static void main(String[] args) {// 创建具体组件对象Component component = new ConcreteComponent();// 创建具体装饰器对象,并将具体组件对象传入Component decorator = new ConcreteDecorator(component);// 调用装饰后的操作decorator.operation();}
}

代码分析

Component 是抽象组件接口,ConcreteComponent 是具体组件类,实现了抽象组件接口的方法。Decorator 是抽象装饰器类,实现了抽象组件接口,并持有一个抽象组件类型的成员变量。ConcreteDecorator 是具体装饰器类,继承自抽象装饰器类,并重写了操作方法,在调用前后添加了额外处理。

在主函数中,先创建具体组件对象ConcreteComponent,然后将其传入具体装饰器对象ConcreteDecorator 的构造函数中,用装饰器包装具体组件。最后调用装饰后的操作,会按照一定的顺序执行额外处理和具体组件操作。

优缺点分析

优点

符合开闭原则

可以在不修改现有代码的情况下,通过新增装饰器类来扩展对象的功能。

可以动态地添加/删除功能

可以根据需要动态地添加或删除对象的功能,组合不同的装饰器实现不同的行为组合。

遵循单一职责原则

具体的组件类只负责核心功能,具体的装饰器类只关注附加的功能,各个类职责明确,可维护性高。

装饰器类与具体组件类独立

装饰器类与具体组件类之间是松耦合的关系,可以独立变化,增加或删除装饰器不会影响其他组件的行为。

缺点

可能产生过多的具体装饰器类

如果系统中有很多功能需要扩展,可能会导致产生大量的具体装饰器类,增加系统的复杂性。

装饰器与组件类的接口不一致

在装饰器模式中,装饰器类和具体组件类的接口不一致,导致客户端需要区分调用。
在这里插入图片描述

总结

装饰模式提供了一种灵活的、可扩展的方式来修改对象的功能,同时保持了简单的接口和代码的可维护性。但是需要权衡好扩展的复杂度和对象接口的一致性。

http://www.lryc.cn/news/179098.html

相关文章:

  • nginx 多层代理 + k8s ingress 后端服务获取客户真实ip 配置
  • 6种最常用的3D点云语义分割AI模型对比
  • UG NX二次开发(C#)-获取UI中选择对象的handle值
  • win10,WSL的Ubuntu配python3.7手记
  • 02-Zookeeper实战
  • 【C语言深入理解指针(1)】
  • 模拟实现简单的通讯录
  • rabbitMQ死信队列快速编写记录
  • 数位dp,338. 计数问题
  • 如何解决git clone http/https仓库失败(403错误)
  • 华为云云耀云服务器L实例评测 | 实例评测使用之硬件性能评测:华为云云耀云服务器下的硬件运行评测
  • Elasticsearch:使用 Elasticsearch 进行语义搜索
  • JVM的主要组成及其作用
  • 会议AISTATS(Artificial Intelligence and Statistics) Latex模板参考文献引用问题
  • 2023最新外贸建站:WordPress搭建外贸独立站零基础小白保姆级教程
  • HTTP请求交互基础(基于GPT3.5,持续更新)
  • 小谈设计模式(6)—依赖倒转原则
  • JetBrains常用插件
  • 【C++哈希应用】位图、布隆过滤器
  • Qt 编译纯c的C99的项目, error: undefined reference to `f()‘
  • TensorFlow入门(五、指定GPU运算)
  • Unity - 实践: Metallic流程贴图 转 Specular流程贴图
  • 第三章:最新版零基础学习 PYTHON 教程(第四节 - Python 运算符—Python 逻辑运算符及示例)
  • 如何做好测试?(三)功能测试 (Functional Testing, FT)
  • Ubuntu-Server-22.04安装桌面+VNC
  • 职业规划,什么是职业兴趣 - 我喜欢做什么?
  • 基于Java的高校学生党员发展流程管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 【NLP的python库(03/4) 】: 全面概述
  • 面试理论篇三
  • ShardingSphere|shardingJDBC - 在使用数据分片功能情况下无法配置读写分离