03-JAVA设计模式

设计模式GOF23

GOF23是指由设计模式经典名著《Design Patterns: Elements of Reusable Object-Oriented Software》(中译本名为《设计模式——可复用面向对象软件的基础》)的四位作者Erich Gamma、Richard Helm、Ralph Johnson、以及John Vlissides提出的23种设计模式。这四位作者常被称为“四人组”(Gang of Four,简称GOF)。

这23种设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。

这些设计模式不仅能够帮助开发者提高设计的灵活性和代码的重用性,还能使问题的解决方案更加清晰、易于理解。它们被广泛应用在各种软件开发项目中,成为软件开发领域的重要工具和方法。

分类与汇总

分类模式特点
创建型模式-创建型模式关注于对象的创建过程,它们提供了在创建对象时设计对象间关系的方法。
-单例模式保证一个类只有一个实例,并提供一个全局访问点。适用于只需要一个对象实例的场景,如配置信息、线程池等。
-工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。适用于创建对象时不需要指定具体类名的场景。
-抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。适用于需要创建一组相关对象而不需要指定它们的具体类的场景。
-建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。适用于需要逐步构建复杂对象的场景。
-原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。适用于创建新对象成本较大或需要频繁创建对象的场景。
结构型模式-结构型模式关注于类和对象的组合,它们采用继承、聚合等方式组合类和对象以获得更大的结构。
-适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而无法协同工作的类可以一起工作。适用于旧接口与新系统不兼容的场景。
-桥接模式将抽象部分与实现部分分离,使它们可以独立变化。适用于抽象和实现需要独立变化的场景。
-组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和复合对象的使用具有一致性。适用于需要表示对象的部分与整体关系的场景。
-装饰器模式动态地给一个对象添加一些额外的职责。适用于需要动态地给一个对象增加功能或行为的场景。
-外观模式为子系统中的一组接口提供了一个统一的高层接口,使得子系统更容易使用。适用于简化复杂系统的接口或降低子系统与客户端之间的耦合度的场景。
-享元模式运用共享技术有效地支持大量细粒度的对象。适用于系统中存在大量相似对象的场景,通过共享来减少内存占用。
-代理模式为其他对象提供一种代理以控制对这个对象的访问。适用于需要在访问对象时添加额外功能或控制访问权限的场景。
行为型模式-行为型模式关注于对象之间的通信和协作,它们描述了类或对象怎样交互以及怎样分配职责。
-模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。适用于在父类中定义算法框架,在子类中实现具体步骤的场景。
-策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。使得算法可以独立于使用它的客户变化。适用于多种算法或行为需要根据不同情况动态选择的场景
-状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。适用于需要在对象内部状态改变时改变其行为的场景。
-观察者模式定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。适用于一个对象状态变化需要通知其他对象的场景。
-迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。适用于需要遍历集合元素的场景,隐藏集合的内部结构。
-责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。适用于多个对象需要处理同一请求,且处理顺序可能变化的场景。
-中介者模式用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。适用于系统中对象之间存在大量复杂交互的场景,通过中介者来简化交互过程。
-访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。适用于需要对一个对象结构中的对象进行多种不同操作,并且这些操作易于扩展的场景。
-解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。适用于需要解释和执行特定语法或表达式的场景,如解析配置文件、编写编译器等。

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

婴儿洗衣机有必要买吗?四款好评婴儿洗衣机性能大对比

由于宝宝的日常衣物是经常需要换洗的,而且有时候一天好几套衣服,遇上尿湿了、吐奶了,换洗就更勤。每次一点点衣物就放进家庭用的大容积洗衣机清洗,会相对的比较容易耗水耗电。而如果把宝宝的换洗衣物堆积一阵子,汇总了…

重磅!!!监控分布式NVIDIA-GPU状态

简介:Uptime Kuma是一个易于使用的自托管监控工具,它的界面干净简洁,部署和使用都非常方便,用来监控GPU是否在占用,非常美观。 历史攻略: docker应用:搭建uptime-kuma监控站点 win下持续观察…

VSCODE自定义代码片段简述与基础使用

目录 一、 简述二 、 基础使用说明2.1 新建一个代码块工作区间2.2 语法 三、 示例四、 参考链接 一、 简述 VSCode的自定义代码片段功能允许开发者根据自己的需求定义和使用自己的代码片段,从而提高编码效率。 优点: 提高效率: 自定义代码片段能够减少…

08 内核开发-避免冲突和死锁-mutex

08 内核开发-避免冲突和死锁-mutex 课程简介: Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。 …

JAVA实现easyExcel模版导出

easyExcel文档 模板注意&#xff1a; 用 {} 来表示你要用的变量 &#xff0c;如果本来就有"{“,”}" &#xff0c;特殊字符用"{“,”}"代替{} 代表普通变量{.}代表是list的变量 添加pom依赖 <dependency><groupId>com.alibaba</groupId&g…

记一次数据查询问题

背景: 有一个数据表,适用原始查询就能查到数据 select * from t_easy_barcode where FP01 = panel_jitaix32_2024_04_25_10_29_57 当我把表中数据列重命名之后sql如下: 因此 我先统计了一下数据表中数据有多少,查询发现有 2482872条 因此首先想到的问题是查询一…

【机器学习】特征筛选实例与代码详解

机器学习中的特征筛选 一、特征筛选的重要性与基本概念二、特征筛选的方法与实践1. 基于统计的特征筛选2. 基于模型的特征筛选3. 嵌入式特征筛选 三、总结与展望 在机器学习领域&#xff0c;特征筛选作为预处理步骤&#xff0c;对于提高模型性能、简化模型结构以及增强模型解释…

是时候了解替代FTP传文件的最优传输方案了

目前越来越多的企业在寻找替代FTP传文件的方案&#xff0c;主要原因在于其固有的一些弊端&#xff0c;在现代企业数据传输需求中可能导致安全性、效率和可靠性方面的问题。以下是FTP的一些主要弊端&#xff1a; 1.数据传输不加密&#xff1a;FTP在传输过程中不加密数据&#xf…

Mybatis入门(入门案例,IDEA配置SQL提示,JDBC介绍,lombok介绍)

目录 一、Mybatis入门案例介绍整体步骤创建SpringBoot项目pom依赖准备测试数据新建实体类配置Mybatis数据库连接信息新建接口类,编写SQL代码单元测试 二、IDEA配置SQL提示三、JDBC是什么案例JDBC和Mybatis对比 四、数据库连接池介绍如何实现一个数据库连接池切换数据库连接池 五…

commvault学习(6):备份oracle(包括oracle的安装)

1.环境 CS、MA&#xff1a;一台windows server2012 客户端&#xff1a;2台安装了oracle11g的windows server2008 1.1 windows server2008安装oracle11g &#xff08;1&#xff09;右击安装包内的setup&#xff0c;以管理员方式运行 &#xff08;2&#xff09;取消勾选接收安…

前端学习<四>JavaScript——48-jQuery动画详解

前言 jQuery提供的一组网页中常见的动画效果&#xff0c;这些动画是标准的、有规律的效果&#xff1b;同时还提供给我们了自定义动画的功能。 显示动画 方式一&#xff1a; <span style"background-color:#f8f8f8"><span style"color:#333333"…

Qt 把.exe打包成安装文件形式

目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…

【重磅】刚刚,《学位法》通过!!!2025年1月1日起施行!

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

JetBot手势识别实验

实验简介 本实验目的在JetBot智能小车实现手势识别功能&#xff0c;使用板卡为Jetson Nano。通过小车摄像头&#xff0c;识别五个不同的手势&#xff0c;实现小车的运动及灯光控制。 1.数据采集 连接小车板卡的Jupyterlab环境&#xff0c;运行以下代码块&#xff0c;配置数据…

rust 卸载重新安装 安装

原因&#xff1a;接触区块链时报错 linking with x86_64-w64-mingw32-gcc failed: exit code: 1 Rust编译需要C环境&#xff0c;如果你没有&#xff0c;Rust也能安装成功&#xff0c;只是无法编译代码 C的编译工具有两个&#xff0c;一个是msvc&#xff0c;也就是visual studi…

pytest-xdist:远程多主机 - 分布式运行自动化测试

简介&#xff1a;pytest-xdist插件使用新的测试执行模式扩展了pytest&#xff0c;最常用的是在多个CPU之间分发测试以加快测试执行&#xff0c;即 pytest -n auto同时也是一个非常优秀的分布式测试插件&#xff0c;分别支持ssh和socket两种方式实现master和worker的远程通讯。…

【ensp实验】路由过滤与引入

要求&#xff1a; 1、按照图示配置IP地址&#xff0c;R1, R3&#xff0c;R4上使用loopback 口模拟业务网段&#xff1b; 2、R1和R2运行RIPv2&#xff0c;R2&#xff0c;R3和R4运行OSPF&#xff0c;各自协议内部互通&#xff1b; 3、在RIP和OSPF间配置双向路由引入&#xff0c;要…

imutils包

imutils是Adrian Rosebrock开发的一个python工具包&#xff0c;它整合了opencv、numpy和matplotlib的部分操作&#xff0c;使这些操作更加简便快捷。今天我们将对它的部分功能进行介绍&#xff0c;以便大家在今后的学习工作中&#xff0c;能够灵活运用好imutils包。 安装 当我们…

Idea 21版本 解决Service 控制台启动类不显示端口

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 1.关闭idea&#xff0c;结束进程 2.找到 C:\用户\你的用户名\AppData\Local\Temp 删除&#xff08;hsperfdata_大健康&#xff09;文件 说明&#xff08;hsperfdata_大健康&#xff09; 后面三个中文是…

庐山研习班上介绍的25个LINUX工具

从2013年的第一届算起&#xff0c;庐山研习班走过十余个年头&#xff0c;办了十几次了。但每一次&#xff0c;都有很多不一样。即使是相同的主题&#xff0c;也有很大差异。 今年春季的庐山研习班是在上个周末。周四晚上我和大部分同学都到了五老峰脚下的训练基地。 除了周六下…
最新文章