Java设计模式:核心概述(一)
在软件开发中,设计模式是一种被广泛认可的解决方案,用于解决在软件设计中经常遇到的一些特定问题。Java作为一种面向对象的编程语言,特别适合于应用各种设计模式。本文将带您深入了解Java中的设计模式,包括它们的定义、出现的原因、解决的问题、历史发展、应用场景以及优缺点。
目录
- 一、设计模式的历史发展
- 二、设计模式出现的原因
- 三、设计模式的定义
- 四、设计模式分类及主要作用
- 创建型模式(Creational Patterns)
- 结构型模式(Structural Patterns)
- 行为型模式(Behavioral Patterns)
- 五、设计模式的应用场景
- 六、设计模式的优缺点
- 七、总结
一、设计模式的历史发展
设计模式的概念最早可以追溯到20世纪70年代的建筑设计领域。后来,这个概念被引入到软件工程中,并逐渐形成了一套完整的设计模式理论体系。其中,最具代表性的是《设计模式:可复用面向对象软件的基础》一书,它系统地总结了23种常见的设计模式,并成为了设计模式领域的经典之作。
二、设计模式出现的原因
设计模式的出现是为了解决软件设计过程中的一些常见问题。在软件开发中,我们经常会遇到一些重复出现的问题,例如如何创建对象、如何组织类和对象之间的关系、如何实现对象之间的通信等。设计模式就是针对这些问题提出的最佳实践方案,它们经过了长时间的验证和优化,被广大开发者所接受和使用。
三、设计模式的定义
设计模式是在特定上下文中为解决某一类问题而提出的一种可复用的设计方案。它不是一种具体的实现代码,而是一种解决问题的思路和方法论。通过设计模式,我们可以提高软件系统的可维护性、可扩展性和可复用性。
四、设计模式分类及主要作用
Java中常用的设计模式有23种,GoF(四人帮,即Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides)在其经典著作《设计模式:可复用面向对象软件的基础》中定义了23种设计模式。这些设计模式被分为三类:创建型模式、结构型模式和行为型模式。
设计模式主要解决以下几类问题:
- 创建型问题:如何创建对象,如何控制对象的创建过程,以及如何减少创建对象时的开销。
- 结构型问题:如何将类和对象组合成更大的结构,以实现特定的功能。
- 行为型问题:如何定义对象之间的通信和协作方式,以实现特定的业务逻辑。
以下是这23种设计模式的简要介绍:
创建型模式(Creational Patterns)
创建型模式关注对象的创建过程,旨在将系统与它的对象创建、结合、表示的方式分离,增强对象和类之间的独立性。
- 简单工厂模式(Simple Factory):根据参数的不同返回不同类的实例。不属于GoF 23种设计模式,但经常作为入门示例。
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
- 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
- 单例模式(Singleton):确保一个类仅有一个实例,并提供一个访问它的全局访问点。
结构型模式(Structural Patterns)
结构型模式关注类和对象的组合,继承结构以形成更大的结构。
- 适配器模式(Adapter):将一个类的接口转换成客户期望的另一个接口。Adapter模式使得原本由于接口不兼容而无法一起工作的那些类可以一起工作。
- 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
- 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
- 外观模式(Facade):为子系统中的一组接口提供一个一致的高层接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
- 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
行为型模式(Behavioral Patterns)
行为型模式关注对象间的通信。
- 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户变化。
- 观察者模式(Observer)/发布-订阅模式(Publish-Subscribe):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素, 而又不暴露该对象的内部表示。
- 责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
- 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以后可以将该对象恢复到保存的状态。
- 解释器模式(Interpreter):给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它自己的类。
- 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
这些设计模式为软件设计提供了可复用的解决方案,帮助开发者解决常见的设计问题。在实际应用中,往往需要根据具体情况和需求选择合适的设计模式或结合多种设计模式来解决问题。
五、设计模式的应用场景
在Java编程中,设计模式的应用场景非常广泛。例如,在构建大型系统时,我们可以使用工厂模式来管理对象的创建过程;在实现复杂的业务逻辑时,我们可以使用策略模式来定义可切换的算法族;在优化系统性能时,我们可以使用单例模式来减少不必要的对象创建开销。此外,还有观察者模式用于实现事件驱动的系统;装饰器模式用于动态地添加或撤销对象的功能等。
六、设计模式的优缺点
优点:
- 提高代码的可维护性和可读性:通过使用设计模式,我们可以将复杂的业务逻辑分解为简单的、可管理的部分,从而提高代码的可维护性和可读性。
- 提高代码的复用性:设计模式提供了一种可复用的解决方案,我们可以在不同的项目中重复使用相同的模式来解决类似的问题。
- 降低耦合度:设计模式可以帮助我们降低类与类之间的耦合度,使得系统更加灵活和可扩展。
缺点:
- 过度使用可能导致复杂度增加:如果过度使用设计模式或者在不合适的场景下使用设计模式,可能会导致代码的复杂度增加,反而降低了代码的可读性和可维护性。
- 学习成本较高:掌握设计模式需要一定的时间和经验积累,对于初学者来说可能存在一定的学习难度。
七、总结
设计模式是Java编程中不可或缺的一部分,它们为我们提供了一种解决常见问题的有效方法。通过深入学习和掌握设计模式,我们可以编写出更加优雅、可维护和可扩展的代码。
相关文章:
Java设计模式:核心概述(一)
在软件开发中,设计模式是一种被广泛认可的解决方案,用于解决在软件设计中经常遇到的一些特定问题。Java作为一种面向对象的编程语言,特别适合于应用各种设计模式。本文将带您深入了解Java中的设计模式,包括它们的定义、出现的原因…...

计算机网络:IP
引言: IP协议是互联网协议族中的核心协议之一,负责为数据包在网络中传输提供路由寻址。它定义了数据包如何在互联网上从源地址传输到目的地址的规则和流程。IP协议使得各种不同类型的网络设备能够相互通信,实现了全球范围内的信息交换。 目录…...
CSS中使用变量的两个函数var和calc
CSS/CSS3 变量var()函数和calc()函数计算的使用 var()变量 var变量的定义语法 : --变量名 (两个短横线加上变量名) calc() 函数计算 calc使用的时候有几个地方需要注意: 1. 运算符前后都需要保留一个空格 2. 任何长度值都可以使用calc()函数进行计算; 3. 支持 - …...

了解docker与k8s
随着 k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s 进行对比,不禁问道:Docker 不香吗? k8s 是 kubernetes 的缩写,8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…...
服务器防火墙的应用技术有哪些
服务器防火墙的应用技术有哪些 1.数据包过滤技术 数据包过滤是最基本的服务器防火墙技术之一,它根据一系列预定义规则过滤进出网络的数据包。数据包过滤器通常基于IP地址、端口号和协议类型等信息来判断数据包是否合法,如果不符合规则,则将被…...

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?
1、问题背景 使用的安卓平台,客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后,前3-5帧图像是偏暗、偏色的,如下图所示,是抓取出流的前25帧图像, 前3帧颜色是偏蓝的,…...

SD-WAN技术:优化国内外服务器访问的关键
在全球化的商业环境中,企业经常需要在国内访问国外的服务器。然而,由于地理位置和网络架构的限制,这种跨国访问往往会遇到速度慢、延迟高等问题。SD-WAN(软件定义广域网)技术的兴起,为企业提供了一种新的解…...

【MySQL】学习和总结标量子查询
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-kLo6jykc7AcEVEQk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

vue3第三节(v-model 执行原理)
特殊说明: 以下vue3语法是基于 3.4之前版本进行使用的,3.4之后的版本 引入了 defineModel 宏,后续会介绍defineModel 1、vue3 与vue2 中v-model区别 vue3 中v-model绑定的不再是value,而是modelValue,接收的方法也不再…...

RunnerGo UI自动化测试脚本如何配置
RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化…...
Android 指南针校准进度计算实现
关于Android中指南针的实现,我们可以使用传感器来获取设备的方向信息,从而实现指南针功能。 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sensorManager (SensorManager) getSystemService(Conte…...
c++学习:Lambda练习和数组练习
练习一 进行加减乘除 普通方法 #include <iostream> using namespace std; int add(int a,int b) {return ab; } int min(int a,int b) {return a-b; } int mul(int a,int b) {return a*b; } float divRet(int a,int b) {return (float)a/b; } int main() {int a;int …...
数据仓库和数据湖的区别
数据仓库和数据湖是两种不同的数据存储和管理架构,它们有以下区别: 1.数据结构:数据仓库采用结构化的数据模型,通常是规范化的关系型数据库,其中数据以表格形式组织,使用预定义的模式和架构。而数据湖则是…...

tkinterFrame框架+标签框架LabelFrame+Toplevel窗口的使用
1.在tkinter中,Frame是一个容器小部件用于组织和管理其他小部件。它可以作为一个独立的可见区域,也可以作为其他小部件的父容器。 import tkinter as tk import tkinter.ttk as ttk import tkinter.messagebox as mbm tk.Tk() m.title("tkinter L…...
C 语言中的 char 关键字详解
1. char类型 char类型用于存储单个字符,占用1个字节的内存空间。在C语言中,char类型可以用于存储ASCII码表中的任意字符,包括大小写字母、数字、标点符号等。例如: char ch A;在这个例子中,变量ch存储了字符A的ASCI…...
信息安全管理与评估赛题解析-应急响应(含环境)
服务器应急响应 文章目录 服务器应急响应题目:答案:192.168.1.7答案:Linux x86_64答案:shodan答案:DIRSEARCH答案:24/Apr/2022:15:26:42答案:2022答案:/var/www/html/footer.php答案:./prism答案:/root/.mal/prism答案:后门行为相关资源...

微服务-微服务Spring Security OAuth 2实战
1. Spring Authorization Server 是什么 Spring Authorization Server 是一个框架,它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供了一个安全、轻…...

二次供水物联网:HiWoo Cloud助力城市水务管理升级
随着城市化的快速推进,二次供水系统作为城市基础设施的重要组成部分,其稳定运行和高效管理显得至关重要。然而,传统的二次供水管理方式在应对复杂多变的城市供水需求时,显得力不从心。为了破解这一难题,HiWoo Cloud平台…...
P1015 [NOIP1999 普及组] 回文数
题目传送门 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个十进制数 56,将 56 加 65(即把 56 从右向左读),得到 121 是一个…...

【MATLAB】兔子机器人动力学模型解读(simulink中的simscape的各模块介绍)
1、动力学模型 Rectangular Joint 控制平面上(x,y轴)的移动,去掉以后,机器人在原地翻滚不移动 Rigid Transform 坐标转换,B站视频已收藏 去掉,机体与地面贴合 此处的作用是设定机体的初…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...