设计模式基础——概述(1/2)

news2024/11/20 10:44:20

目录

一、设计模式的定义

二、设计模式的三大类别

三、设计模式的原则

四、主要设计模式目录

4.1 创建型模式(Creational Patterns)

4.2 结构型模式(Structural Patterns)

4.3 行为型模式(Behavioral Patterns)


一、设计模式的定义

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。这些模式代表了最佳实践,通常由有经验的面向对象的软件开发人员采用,以解决在软件设计过程中经常遇到的一般问题。

设计模式提供了一种通用的语言和框架,使得开发者可以更高效地沟通复杂的系统架构,并且允许他们复用已有的解决方案来避免重新发明轮子。每种设计模式都描述了一个在软件开发中不断重复出现的问题,以及解决这个问题的核心思想。它们有助于提高代码的可读性、可维护性和可靠性,并使软件工程更加工程化和规范化。

二、设计模式的三大类别

设计模式分为三大类:创建型模式(关注对象的创建)、结构型模式(关注对象之间的组合)和行为型模式(关注对象之间的交互和职责分配)。

大家在看一些资料的时候,会发现,有人特意提到J2EE类设计模式。这通常指的是在Java 2平台企业版(Java 2 Platform, Enterprise Edition,简称J2EE)中使用的一系列设计模式。这些设计模式是针对开发企业级应用的特殊需求而提出的,它们可能并不属于经典的Gang of Four (GoF)设计模式分类中的三大类:创建型、结构型和行为型。

因此,说“J2EE设计模式”是一种单独的设计模式类别或子集是合理的。这主要是因为J2EE应用程序有其独特的架构特点和挑战,比如处理多层体系结构、分布式计算、事务管理、安全性等。为了解决这些问题,开发者们总结了一系列特定于J2EE环境的最佳实践,这些实践有时被称为“J2EE设计模式”。

需要注意的是,随着技术的发展,特别是Java平台从J2EE到Java EE(Java Platform, Enterprise Edition),再到现在的Jakarta EE(由Eclipse基金会维护的企业级Java规范),一些早期与J2EE相关的模式可能会发生变化或不再适用。同时,新的模式也可能出现以适应新的技术和框架。

比如,大家都熟知的MVC设计模式,这可是初学JAVA必须领会的模式,比如经典的Struts框架,就是基于MVC设计模式。MVC(Model-View-Controller)模式是软件工程中的一种经典架构模式,它在J2EE时代就已经被广泛采用,并且对后续的Web开发框架和企业级应用有着深远的影响。然而,随着技术的发展,尤其是从J2EE到Java EE再到Jakarta EE的过程中,许多新的编程模型和框架出现了,它们提供了不同的方式来组织和管理应用程序的结构。

虽然 MVC 仍然是一种有效的设计原则,但它可能不再像以前那样直接映射到现代 Java 框架中的组件。例如,在Spring框架中,尽管基本的概念类似于MVC,但实现方式却有所差异,比如通过DispatcherServlet处理请求、使用@Controller和@RequestMapping注解来定义控制器行为等。

此外,其他现代前端框架,如AngularJS、React或Vue.js,它们也采用了类似的模式,但具体实现和分工与传统的MVC有所不同。这些框架通常将视图和控制器的职责合并在一起,而模型则负责处理数据和业务逻辑。

因此,说MVC模式不再适合所有情况并不完全准确。它的核心思想——分离关注点,仍然是现代软件设计中的重要原则。只不过,随着时间的推移,这种思想可能会以不同的形式体现出来,或者与其他模式组合起来形成更复杂的架构。开发者需要根据具体的项目需求和技术选型来决定最适合的架构模式。

三、设计模式的原则

以下是几个在软件工程中常用的设计原则:

1. 单一职责原则(Single Responsibility Principle, SRP)
   - 一个类或模块应该只有一个改变的原因。
   - 这个原则强调了将代码的职责划分得尽可能清晰和独立。

2. 开闭原则(Open-Closed Principle, OCP)
   - 对扩展开放,对修改关闭。
   - 这个原则建议通过抽象来实现代码的可扩展性,而尽量避免直接修改现有代码。

3. 里氏替换原则(Liskov Substitution Principle, LSP)
   - 子类型必须能够替换其基类型。
   - 这个原则要求在继承体系中,子类应当可以无限制地替代父类,并且不会导致错误或异常。

4. 接口隔离原则(Interface Segregation Principle, ISP)
   - 客户端不应该被迫依赖于他们不需要的方法。
   - 这个原则提倡创建更小、更专业的接口,而不是大型、通用的接口。

5. 依赖倒置原则(Dependency Inversion Principle, DIP)
   - 高层模块不应该依赖低层模块,两者都应该依赖抽象。
   - 抽象不应该依赖细节,细节应该依赖于抽象。
   - 这个原则有助于提高代码的灵活性和可维护性。

6. 合成复用原则(Composite Reuse Principle, CRP)
   - 尽量使用对象组合,而不是继承来达到复用的目的。
   - 这个原则鼓励使用关联关系来实现代码复用,从而降低耦合度。

7. 迪米特法则(Law of Demeter, LoD)或最少知道原则
   - 一个对象应该对其他对象有尽可能少的了解。
   - 这个原则旨在减少模块之间的耦合度,提高代码的可读性和可维护性。

8. 契约式编程(Programming by Contract, PBC)
   - 类和方法之间应有明确的约定(契约),包括前置条件、后置条件和不变条件。
   - 这个原则可以帮助确保代码的正确性和可靠性。

9. 命令查询分离原则(Command-Query Separation, CQS)
   - 方法要么改变对象的状态(命令),要么返回结果(查询),但不能同时做这两件事。
   - 这个原则有助于提高代码的可预测性和可测试性。

以上这些原则都是为了帮助开发者编写出更加健壮、可读、可维护和可扩展的代码。在实际项目中,需要根据具体场景灵活应用这些原则,并与其他设计原则相平衡。

四、主要设计模式目录

4.1 创建型模式(Creational Patterns)

创建型设计模式是用于处理对象的创建过程,它们将对象的实例化和使用解耦。以下是创建型模式中的一些主要模式:

1. 工厂方法(Factory Method)
   - 定义一个用于创建对象的接口,让子类决定实例化哪一个类。
   - 使得一个类的实例化延迟到其子类。

2. 抽象工厂(Abstract Factory)
   - 提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。
   - 适用于需要提供多个相关的对象系列的情况。

3. 建造者(Builder)
   - 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
   - 适用于需要生成的产品有多种表现形式或者组装方式时。

4. 原型(Prototype)
   - 提供了一个从现有对象复制新对象的方法,而不是通过new操作符直接创建新的对象。
   - 当系统需要大量创建相似对象,而且创建过程很耗时的时候,适合使用此模式。

5. 单例(Singleton)
   - 确保一个类只有一个实例,并且提供一个全局访问点。
   - 适用于只需要一个实例来协调系统的某些活动的情况。

这些模式的主要目的是隐藏对象的创建细节,使得代码更加灵活和可扩展,同时减少了代码之间的耦合度。在实际开发中,根据具体的需求和场景选择合适的创建型模式可以使代码更加健壮和易于维护。

4.2 结构型模式(Structural Patterns)

结构型设计模式关注于对象和类的组合方式,它们提供了如何将对象组织在一起以便更好地实现系统功能的方法。以下是结构型模式中的一些主要模式:

1. 适配器(Adapter)
   - 将一个类的接口转换成客户希望的另一个接口。
   - 使得原本不兼容的类可以一起工作。

2. 桥接(Bridge)
   - 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
   - 提供了一种将抽象部分和实现部分解耦的方式。

3. 装饰器(Decorator)
   - 动态地给一个对象添加一些额外的职责。
   - 提供一种比继承更有弹性的替代方案来扩展对象的功能。

4. 外观(Facade)
   - 为子系统中的一组接口提供一个一致的界面。
   - 它定义了一个高层接口,使得子系统更容易使用。

5. 享元(Flyweight)
   - 使用共享技术有效地支持大量细粒度的对象。
   - 减少内存使用并提高程序性能。

6. 代理(Proxy)
   - 为其他对象提供一种代理以控制对这个对象的访问。
   - 可以用于创建轻量级的对象或延迟加载、权限检查等场景。

这些模式通过改变对象间的组合关系,提高了代码的复用性、灵活性和可扩展性,并降低了系统的复杂性。在实际开发中,根据具体的需求和场景选择合适的结构型模式可以使代码更加健壮和易于维护。

4.3 行为型模式(Behavioral Patterns)

行为型设计模式关注于对象之间的通信和责任分配,它们描述了如何在类或对象之间划分算法的职责。以下是行为型模式中的一些主要模式:

1. 模板方法(Template Method)
   - 在一个抽象类中定义了一个算法的框架,而将一些步骤延迟到子类中。
   - 它允许子类在不改变结构的情况下重定义算法的特定步骤。

2. 命令(Command)
   - 将一个请求封装为一个对象,从而使用户可以使用不同的请求、队列或者日志请求,同时还可以支持可撤销的操作。
   - 通过将操作与接收者分离,使得新的请求类型易于添加。

3. 策略(Strategy)
   - 定义了一系列算法,并将每一个算法封装起来,让它们可以相互替换。
   - 策略模式让算法的变化独立于使用该算法的客户。

4. 责任链(Chain of Responsibility)
   - 允许将请求沿着处理者链传递,直到被处理为止。
   - 消除请求发送者和接收者之间的耦合关系。

5. 状态(State)
   - 允许对象在内部状态变化时改变其行为。
   - 当控制流基于对象的状态时,使用状态模式更合适。

6. 观察者(Observer)
   - 定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
   - 提供了一种对象间的一对多发布/订阅机制。

7. 访问者(Visitor)
   - 表示一个作用于某元素结构中的各元素的操作。
   - 它使你可以在不修改各元素类的前提下定义作用于这些元素的新操作。

8. 备忘录(Memento)
   - 在不破坏封装性的前提下,捕获一个对象的内部状态以便稍后恢复它。
   - 提供了一种状态保存和回滚的方法。

9. 中介者(Mediator)
   - 定义一个中介对象来封装一系列的对象交互。
   - 降低了系统的复杂性和耦合度。

10. 迭代器(Iterator)
    - 提供一种顺序访问聚合对象的元素的方式,而不暴露其底层表示。
    - 支持以统一的方式遍历各种数据结构。

11. 解释器(Interpreter)
    - 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
    - 当需要实现一个小规模的语言或者表达式解析时,适合使用此模式。

这些模式通过合理地组织对象间的交互,提高了代码的复用性、灵活性和可扩展性,并简化了复杂的系统设计。在实际开发中,根据具体的需求和场景选择合适的行为型模式可以使代码更加健壮和易于维护。

先整理这么多,后面我们有时间详细一起学习几个常用的设计模式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

alma centos8 dvd 安装jumpserver堡垒机

安装脚本 # 更新系统yum update yum install -y wget curl tar gettext iptables# 安装jumpserver堡垒机curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash安装过程 升级系统、安装需要的软件 安装jumpserve…

报错处理集

这个报错处理集的错误来源于编译arm平台的so文件产生的。但是后续可以补充成linux一个大的错误处理集。 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 第一次整理的时间是2023年12月8日10:05:59,以下错误来源于欧拉系统编译…

高端的露营装备网站搭建的作用是什么

近些年发展促进了露营热潮,周边游也多了起来,城市中高频工作带来的烦恼使得很多人想要放松,露营无疑是接触大自然很好的方式,而选择好的露营装备同样重要,还包括门店经营者,选择好的品牌合作也能带来很多生…

编程怎么学才能快速入门,分享一款中文编程工具快速学习编程思路,中文编程工具之分组框构件简介

一、前言: 零基础自学编程,中文编程工具下载,中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具,零基础…

VSCODE 运行C程序缓慢解决方法之一

最近更换了mingw的版本,安装路径与之前的mingw路径不大一样。结果发现代码运行的时候很慢,弹出窗口后,迟迟没有打印任何东西,就像卡死了一样。试过网上说的一堆方法,没有什么用。 我按照以下流程进行检查: 1.检查min…

苹果始终安全?未必!

传统印象中,苹果似乎始终以安全可靠著称。 但事实上,苹果公司并不乏安全事件。只是你可能从未意识到这些问题,甚至其中一些可能将你置于危险之中。那么,苹果经历过哪些黑客攻击、数据泄露和安全漏洞事件呢? 一、苹果的…

中断、异常和系统调用(2-1,2-2,2-3)

2-1 课堂练习2.1:外部中断 本实训分析 Linux 0.11 对外部中断的响应和处理过程。在每条指令执行的末尾,如果没有关中断,CPU 会检查是否收到了外部中断信号,如果有信号,则 CPU 就切换到核心态去执行对应的中断处理程序…

C语言第十六集(前)

1.关于那个整形存储入char的 是先取好补码,再截断 例: 2.%u是以十进制的形式打印无符号整数 3.注意(背):存储的char类型变量的补码为10000000的直接解析为-128 4.signed char 类型的变量取值范围是-128~127 5.unsigned char 类型的变量取值范围是0~255 6.有符号类型的变量…

编程创意汇聚地,打造个性作品集 | 开源日报 No.97

spring-projects/spring-boot Stars: 70.4k License: Apache-2.0 Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它通过提供默认配置和约定大于配置的方式来减少开发者的工作量。Spring Boot 可以快速地创建独立的、生产级别的基于 Spring 框架的应用程序…

【论文合集】在非欧空间中的图嵌入方法(Graph Embedding in Non-Euclidean Space)

文章目录 1. Hyperbolic Models1.1 Hyperbolic Graph Attention Network1.2 Poincar Embeddings for Learning Hierarchical Representations.1.3 Learning Continuous Hierarchies in the Lorentz Model of Hyperbolic Geometry1.4 Hyperbolic Graph Convolutional Neural Net…

快速登录界面关于如何登录以及多账号列表解析以及config配置文件如何读取以及JsLogin模块与SdoLogin模块如何通信(4)

1、### Jslogin模块与前端以及JsLogin模块与Sdologin的交互 配置文件的读取: <CompanyIdForQq value"301"/> <CompanyIdForWx value"300"/><CompanyIdForWb value"302"/><qq value"https://graph.qq.com/oauth2.0/au…

使用Notepad++编辑器,安装AnalysePlugin搜索插件

概述 是一款非常有特色的编辑器&#xff0c;Notepad是开源软件&#xff0c;Notepad中文版可以免费使用。 操作步骤&#xff1a; 1、在工具栏 ->“插件”选项。 2、勾选AnalysePlugin选项&#xff0c;点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装…

【Linux】resolv.conf 文件

resolv.conf resolv.conf 文件 是 DNS 的 client 端使用的文件&#xff0c;用于设置 DNS 服务器的 ip 地址以及 DNS 域名&#xff0c;还可以配置域名搜索顺序等等。主要包含如下关键字&#xff1a;nameserver、domain、search、sortlist、options。设置的格式都是 关键字空格 …

Java期末复习题之抽象类、接口

点击返回标题->23年Java期末复习-CSDN博客 第1题. 首先设计一个学生抽象类Student&#xff0c;其数据成员有name(姓名)、age(年龄)和degree(学位)&#xff0c;以及一个抽象方法show()。然后由Student类派生出本科生类Undergraduate和研究生类Graduate&#xff0c;本科生类Un…

使用ES6 async awai t进行异步处理

我们往往在项目中会遇到这样的业务需求&#xff0c;就是首先先进行一个ajax请求&#xff0c;然后再进行下一个ajax请求&#xff0c;而下一个请求需要使用上一个请求得到的数据&#xff0c;请求少了还好说&#xff0c;如果多了&#xff0c;就要一层一层的嵌套&#xff0c;就好像…

AI自动生成代码工具

AI自动生成代码工具是一种利用人工智能技术来辅助或自动化软件开发过程中的编码任务的工具。这些工具使用机器学习和自然语言处理等技术&#xff0c;根据开发者的需求生成相应的源代码。以下是一些常见的AI自动生成代码工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

小航助学2023年9月GESP_Scratch一级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号 单选题3.00分 删除编辑附件图文 答案:C 第1题我们通常说的“内存”属于计算机部件中的( ) A、输出设备B、输入设备C、存储设备D、打印设备 答案解析&#xff1a; 单选题3…

Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版(视频笔记)

视频源&#xff1a;1.03-k8s是什么&#xff1f;_哔哩哔哩_bilibili 1 基础知识 1.1 K8s 有用么&#xff1f; K8s有没有用 K8s要不要学&#xff1f; 参考资料: https://www.infoq.com/articles/devops-and-cloud-trends-2022/?itm_sourcearticles_about_InfoQ-trends-report…

FPGA实现电机位置环、速度环双闭环PID控制

一、设计思路 主要设计思路就是根据之前写的一篇FPGA实现电机转速PID控制&#xff0c;前面已经实现了位置环的控制&#xff0c;思想就是通过电机编码器的当前位置值不断地修正PID去控制速度。 那为了更好的实现控制&#xff0c;可以在位置环后加上速度环&#xff0c;实现电机位…

thinkphp lists todo

来由&#xff1a; 数据库的这个字段我想返回成&#xff1a; 新奇的写法如下&#xff1a; 逻辑层的代码&#xff1a; public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…