设计模式-开篇
什么是设计模式
设计模式是一种被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式不是可直接转化为代码的完成解决方案,而是描述了如何解决一个问题的经过,可以用于指导开发人员在他们的应用程序中编写代码,从而提高代码的可读性、可维护性和可扩展性。
设计模式有多种分类方式。根据目的(模式是用来做什么的),可分为创建型,结构型和行为型三类:
- 创建型模式:主要用于创建对象。
- 结构型模式:主要用于处理类和对象的组合。
- 行为型模式:主要用于描述类或对象如何交互和怎样分配职责。
此外,根据范围,即模式主要是处理类之间的关系还是处理对象之间的关系,可分为类模式和对象模式两种。
这些模式包括但不限于工厂模式、单例模式、原型模式、适配器模式、装饰器模式、代理模式等。在软件开发中,设计模式可以提高软件开发效率和质量,减少代码的重复性,并使软件更加灵活、可扩展和易于维护。
应用场景
设计模式的主要应用场景包括但不限于以下几个方面:
- 软件架构设计:在软件架构设计中,设计模式可以用于指导如何组织类和对象,以及如何规划它们之间的交互。这有助于提高软件的可维护性、可扩展性和灵活性。
- 代码重构:当代码变得难以理解和维护时,设计模式可以作为重构的指南。通过使用适当的设计模式,可以将复杂的代码结构简化为更易于理解的结构,同时保持其功能不变。
- 通用问题解决:许多设计模式是为了解决在软件开发中经常出现的问题而创建的。例如,单例模式可以确保一个类只有一个实例,并提供全局访问点,这在需要协调多个对象的行为时非常有用。
- 性能优化:某些设计模式,如观察者模式,可以用于优化性能。观察者模式允许对象通过订阅事件来接收通知,从而避免了不必要的计算和通信开销。
- 大型项目开发:在大型项目中,设计模式可以作为一种通用的语言,帮助开发团队更好地协作。通过使用共同的设计模式,团队成员可以更轻松地理解彼此的代码,并提高开发效率。
需要注意的是,虽然设计模式提供了解决问题的最佳实践,但它们并不是万能的。在使用设计模式时,应根据具体情况进行评估,并确保它们符合项目的需求和目标。
实际案例
当然可以。以下是一些常见的设计模式的实际案例:
- 单例模式(Singleton Pattern):在许多应用程序中,确保一个类只有一个实例是非常重要的。例如,在数据库连接中,通常使用单例模式来管理数据库连接。只有一个数据库连接实例可以确保对数据库的多个操作是线程安全的。
- 工厂模式(Factory Pattern):工厂模式是一种创建型模式,它提供了一种创建对象的接口,但具体创建的对象类型可以在运行时决定。例如,在图形用户界面(GUI)开发中,可以使用工厂模式来创建不同类型的按钮。这样,可以根据需要动态地创建和配置按钮。
- 适配器模式(Adapter Pattern):适配器模式是一种结构型模式,它允许将一个类的接口转换成客户端所期望的另一种接口。例如,在音频设备中,一个耳机适配器可以将设备的输出接口转换为耳机可以接受的输入接口。
- 装饰器模式(Decorator Pattern):装饰器模式是一种结构型模式,它可以在不修改原始类的情况下动态地添加功能或修改功能。例如,在编程语言解释器中,可以使用装饰器模式来动态地添加或修改语法规则。
- 观察者模式(Observer Pattern):观察者模式是一种行为型模式,它允许对象通过发布/订阅模型进行通信。例如,在天气预报应用中,天气数据可以被订阅,当天气发生变化时,所有订阅的用户都会收到通知。
- 策略模式(Strategy Pattern):策略模式是一种行为型模式,它允许根据不同的策略执行不同的算法或行为。例如,在游戏开发中,可以使用策略模式来动态地选择游戏的AI策略,从而提供不同的游戏体验。
- 模板方法模式(Template Method Pattern):模板方法模式是一种行为型模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。例如,在图像处理软件中,可以使用模板方法模式来定义图像处理的基本步骤(加载图像、处理图像、保存图像),并允许用户通过继承和重写这些步骤来自定义图像处理算法。
这些案例只是设计模式应用的一部分示例。在实际软件开发中,设计模式的应用非常广泛,可以根据具体的需求和场景选择合适的设计模式来解决特定的问题。
代码示例
设计模式的示例代码有很多,这里我提供一个观察者模式的示例代码,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生改变时,其相关依赖项(观察者)会被通知,自动更新。
import java.util.ArrayList;
import java.util.List;// 观察者接口
interface Observer {void update(String event);
}// 被观察者接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String event);
}//具体被观察者类
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String event;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String event) {this.event = event;for (Observer observer : observers) {observer.update(event);}}
}//具体观察者类
class ConcreteObserver implements Observer {private String name;ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String event) {System.out.println(name + " received event: " + event);}
}
使用示例:
public class Test {public static void main(String[] args) {Subject subject = new ConcreteSubject(); // 具体被观察者对象Observer observer1 = new ConcreteObserver("Observer 1"); // 具体观察者对象1Observer observer2 = new ConcreteObserver("Observer 2"); // 具体观察者对象2subject.registerObserver(observer1); // 注册观察者对象1subject.registerObserver(observer2); // 注册观察者对象2subject.notifyObservers("event"); // 通知所有注册的观察者对象事件event,所有观察者对象会响应这个事件,打印出收到的事件内容。}
}
## 分类
设计模式的分类主要分为**创建型模式**、**结构型模式**和**行为型模式**。此外,也有一种扩展模式。1. **创建型模式**:用于处理对象的创建过程,包括如单例模式、工厂方法模式、抽象工厂模式、建造者模式等。
2. **结构型模式**:用于处理类或对象的组合,以形成更大的结构,例如适配器模式、装饰者模式、代理模式等。
3. **行为型模式**:用于描述类或对象如何交互,以及划分责任和如何通信,包括策略模式、观察者模式、迭代器模式等。以上是简单介绍,各种设计模式有各自的应用场景和特点,需要结合实际问题进行选择和使用。## 总结
在接下来的文章中,我们会对设计模式逐一进行梳理和解释说明,让我们开始设计模式的学习之旅吧
相关文章:
设计模式-开篇
什么是设计模式 设计模式是一种被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式不是可直接转化为代码的完成解决方案,而是描述了如何解决一个问题的经过…...

HashMap的实现原;HashMap的工作原理;HashMap存储结构; HashMap 构造函数
文章目录 说一下HashMap的实现原理(非常重要)①HashMap的工作原理HashMap存储结构常用的变量HashMap 构造函数tableSizeFor() put()方法详解hash()计算原理resize() 扩容机制get()方法为什么HashMap链表会形成死循环 HashMap是我们在工作中使用到存储数据特别频繁的数据结构&am…...
JavaScript 原型,原型链的特点
JavaScript 的原型(Prototype)和原型链(Prototype chain)是 JavaScript 面向对象编程中的重要概念。 原型(Prototype) 在 JavaScript 中,每个对象都有一个原型对象,而这个原型对象…...

越南服务器租用:企业在越南办工厂的趋势与当地(ERP/OA等)系统部署的重要性
近年来,越南逐渐成为全球企业布局的热门目的地之一。许多企业纷纷选择在越南设立工厂,以利用其低廉的劳动力成本和优越的地理位置。随着企业在越南的扩张,对于当地部署ERP系统或OA系统等的需求也日益增长。在这种情况下,租用越南服…...
Qt QString与QChar总结
(一) QString 1 QString的简介 QString 是Qt 中的一个类,用于存储字符串,QString 没有父类。QString 存储的是一串字符,每个字符是一个 QChar 类型的数据。QChar 使用的是 UTF-16 编码,一个字符包含 2字节数据。 对于超过 6553…...

Leetcode算法系列| 1. 两数之和(四种解法)
目录 1.题目2.题解解法一:暴力枚举解法二:哈希表解法解法三:双指针(有序状态)解法四:二分查找(有序状态) 1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…...

汇编-pop出栈指令
32位汇编 执行动作分为两步: 第一步:读出数据 第二步:改变栈地址 如果操作数是16位, 则ESP加2; 如果操作数是32位, 则ESP加4 espesp2 或 espesp4 格式:...

【代码】基于VMD(变分模态分解)-SSA(麻雀搜索算法优化)-LSTM的光伏功率预测模型(完美复现)matlab代码
程序名称:基于VMD(变分模态分解)-SSA(麻雀搜索算法优化)-LSTM的光伏功率预测模型 实现平台:matlab 代码简介:提出了变分模态分解(VMD)和麻雀搜索算法(SSA)与长短期记忆神经网络 (LSTM)相耦合,…...

【UnLua】在 Lua 中定义 UE 反射类型
【UnLua】在 Lua 中定义 UE 反射类型 用法 启动编辑器时遍历 Defines 目录下 lua 脚本来加载 UE 反射类型(开个临时的 Lua VM 即可)直接像 -- define a uenum in lua UEnum.EEnumGuestSomethingElse {Value1 1;Value2 2; }-- use it like a native …...

react的开发中关于图片的知识
React是一个流行的JavaScript库,用于构建用户界面。在React开发中,图片是一个非常重要的元素,可以用于美化界面和展示内容。本篇博客将详细讲解React中关于图片的知识。 1. React中使用图片 在React中使用图片非常简单,只需要使…...
AcWing 188:武士风度的牛 ← BFS
【题目来源】https://www.acwing.com/problem/content/190/ 【题目描述】 农民 John 有很多牛,他想交易其中一头被 Don 称为 The Knight 的牛。 这头牛有一个独一无二的超能力,在农场里像 Knight 一样地跳(就是我们熟悉的象棋中马的走法&…...

马养殖场建设VR模拟实训教学平台具有灵活性和复用性
为保障养殖场生物安全,避免疫病传播,学生出入养殖场受时间和地域的限制, 生产实习多以参观为主,通过畜牧企业技术人员的讲解,学生被动了解生产过程。为了解决畜牧养殖实训难的问题,借助VR技术开展畜牧养殖虚…...

云原生技术演进之路-(云技术如何一步步演进的,云原生解决了什么问题?)
云技术如何一步步演进的? 云原生解决了什么问题? 物理设备 电脑刚被发明的时候,还没有网络,每个电脑(PC),就是一个单机。 这台单机,包括CPU、内存、硬盘、显卡等硬件。用户在单机…...

基于OGG实现Oracle实时同步MySQL
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...

〖大前端 - 基础入门三大核心之JS篇㊷〗- DOM事件对象及它的属性
说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作…...

如何搭建zerotier服务器组网实现内网穿透
小白花了四天的下班时间终于把zerotier网络调通,此刻坐在桌前舒畅地喝口茶~~ 下面来详细记录下这几天踩的坑: 起因就在于一直在iPad上用向日葵连接公司电脑的我觉得向日葵的界面用的实在难受,vs code操作十分不灵光&…...

【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25
目录 什么是浅拷贝?浅拷贝的问题使用深拷贝解决浅拷贝问题结束语 什么是浅拷贝? 如果在一个类中没有人为定义拷贝函数,则系统会提供默认拷贝函数。那么在此默认拷贝函数中主要进行了简单的赋值操作,那这个简单的赋值操作我们一般…...

加速软件开发:自动化测试在持续集成中的重要作用!
持续集成的自动化测试 如今互联网软件的开发、测试和发布,已经形成了一套非常标准的流程,最重要的组成部分就是持续集成(Continuous integration,简称CI,目前主要的持续集成系统是Jenkins)。 那么什么是持…...
工具及方法 - 查找排名:国内网络作家排名
中国十大网络小说作家排名,在买购网的排名: 中国十大网络小说作家 网络小说作家排行榜 中国著名网络写手排名→MAIGOO生活榜 (这个网站里还有很多其他的排名。) 1,唐家三少 2,辰东 3,我吃西红…...
MySQL INSERT插入条件判断:如果不存在则插入
MySQL INSERT插入条件判断:如果不存在则插入(转) 我们经常需要进行sql的批量插入,要求:该条记录不存在则插入,存在则不插入。如果使用一条INSERT语句实现呢? ####普通的 INSERT INTO 插入&…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...