软件开发设计模式的一点个人理解

ops/2024/9/20 9:21:42/ 标签: 设计模式

序言

从最开始买了本《设计模式》吃灰,到自己做了一些软件开发后,又看了一些设计模式的资料,总结一下自己对各种设计模式的理解

创建型模式

1. 单例模式

如果软件运行过程中只存在唯一的实例,就可以使用,访问会很方便,只要inlcude头文件之后,然后调用Class::GetInstance()进行访问即可。

2. 工厂模式

包含三种子模式,

  1. 工厂方法,这个模式就是通过传入一个区分类类型的字符串给工厂,工厂创建对应的类,代码体现就是从new一个类,变为了通过工厂和传入标识创建类。
  2. 简单工厂,这个需要为每一种类创建相应的工厂,可以结合工厂方法一起使用。
  3. 抽象工厂,创建一系列类使用,基本用不到
3. 原型模式

主要在于实现一个clone函数,通过clone来创建对象,从拷贝构造函数生成对象,而不是构造函数,用于构造函数很复杂的类,和需要创建多个对象时使用。

4. 建造者模式

这个顾名思义,最开始看《设计模式》也是这个,讲了一个搭建迷宫的例子,主要用于搭建式的创建,感觉也用不到

结构型模式

1. 桥接模式 https://zhuanlan.zhihu.com/p/703288601

就是一个抽象类,内部组合了另外的抽象类,抽象形状类的内部组合了抽象颜色类,然后进行多种组合即可。

2. 适配器模式

参考语言本身的适配器模式即可,比如C++的queue和stack内部都是由deque进行的适配,虽然这个不涉及面向对象,但所表现的含义一致,核心观点是适配

3. 装饰者模式

主要是为了个一个类做一些额外的功能,通过组合的方式,而不是子类化的添加,核心观点是装饰

4. 代理者模式

通过一个代理类来访问内部的实现类,内部实现类对于外部不可访问,核心观点是代理访问

5. 外观模式

用于为多个子系统提供统一访问的抽象接口,用户只需要通过具体外观类控制接口,不需要了解各个子系统实现,核心观点是简化复杂系统的交互性

6. 享元模式

通过共享方式减少内存开销,但需要多出数据结构维护共享的数据,内存池就是其一种其思想体现,核心观点是共享资源

7. 组合模式 https://blog.csdn.net/jun778895/article/details/141526587

强调部分-整体的层次结构,json的设计是其一种体现。object是容器节点,其他类型是叶子节点,目前涉及不到,仅了解应用场景

行为型模式

1. 策略模式

就是多态

2. 观察者模式

被观察者维护观察者列表和状态,当被观察者内部状态发生变化时通知观察者

3. 中介者模式

降低耦合,负责封装一组对象之间的交互,如一个模块存在一个管理者负责与所有相关类进行通信

4. 状态模式

状态机,对象在不同状态下表现出不同的行为

5. 命令模式

请求封装为一个具体的对象,并提供对请求执行、撤销和重做的支持

6. 模板方法模式

继承和多态的共同体现,子类可以复用基类共同代码,同时实现自定义行为。

7. 迭代器模式

STL迭代器是其体现,提供间接方式访问容器,不需要知道容器的具体实现方式,其用意搜索如下,来自百度AI

  1. ‌访问和操作容器的统一接口
  2. 容器与算法的分离
  3. 灵活性
  4. 避免直接暴露容器内部实现
  5. 弥补语言不足
8. 访问者模式 https://blog.csdn.net/GOLOJO/article/details/139620699

允许在不修改类行为的前提下,定义作用于这个类上的新的操作,注意是直接在这个类上进行操作(调用)
根据实现来看,是可以通过组合的方式直接调用其提供的公有函数,也能实现不同的访问方式,但这种操作是在一个新的类上进行。

9. 解释器模式 https://blog.csdn.net/K1_uestc/article/details/135860748

定义了⼀个语⾔的⽂法,并且建⽴⼀个【解释器】来解释该语⾔中的句子,如编程语言、SQL语句、正则表达式,目前涉及不到,仅了解应用场景

10. 责任链模式 https://blog.csdn.net/L_qingting/article/details/140044903

多个对象可以处理同一个请求,一个请求往责任链发送,不确定具体由谁进行处理时使用

11. 备忘录模式 https://blog.csdn.net/qq_68194402/article/details/141690946

用于恢复过往状态,对象包含保存当前状态和恢复过去状态的方法,过往状态由管理者保存。


http://www.ppmy.cn/ops/105962.html

相关文章

【Android】Material Design编写更好的UI

Toolbar 对于控件ActionBar我们非常熟悉,就是我们常见的标题栏,但ActionBar只能位于活动的顶部,因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar,我们要使用Toolbar就需要先将标题栏改为不显示 先来看看…

Neural Magic发布GuideLLM:评估和优化大型语言模型(LLM)部署的强大工具

大型语言模型(LLMs)的部署和优化已成为各种应用的关键。Neural Magic推出了GuideLLM,以应对对高效、可扩展且具有成本效益的LLM部署日益增长的需求。这款强大的开源工具旨在评估和优化LLM的部署,以确保它们在满足现实中的推理需求…

高清无损!探索PDF转JPG的最佳实践工具

在信息爆炸的今天,PDF文件因其跨平台兼容性和文档保护特性,成为了工作、学习和日常生活中不可或缺的一部分。但是很多时候我们并不需要精度那么高的文件,图片分享更符合快捷的要求。这次我们就一起探讨有什么PDF转jpg的工具吧。 1.福昕PDF转…

QT实现文本的读写

使用QT读写文件 来,在程序中文件的读写是非常重要的,毕竟我们在大多数时候都是要访问文本文件的,那么今天就来学习一下怎么使用QT来读写文件。 1.写界面 直接在ui界面中编辑即可 布局小技巧我们先选择两个按钮,然后水平布局&am…

代码随想录:63. 不同路径 II

63. 不同路径 II 由于结果较大,所以我们用long long 使用成dp数组的类型。 首先数组初始化,如果起点没有石头,则初始化为1. 然后二维遍历数组,如果该点为石头则跳过(该点路径数则为0),否则加…

Nginx服务器权重配置指南:优化负载均衡策略

在Nginx的负载均衡配置中,服务器权重是一个重要的参数,它允许管理员根据后端服务器的处理能力来分配请求的比例。通过设置权重,可以实现更智能的请求分发,提高资源利用率,并确保应用的性能和稳定性。本文将详细介绍如何…

初识RabbitMQ

RabbitMQ是一个开源的消息代理软件,主要用于实现消息队列的功能。它允许应用程序之间通过消息进行异步通信,从而提高系统的可扩展性和可靠性。RabbitMQ支持多种消息协议,最常用的是AMQP(高级消息队列协议)。 RabbitMQ…

每日刷一刷力扣SQL(八)

185.部门工资前三高的所有员工 考察点:窗口函数的使用 select d.name as Department ,t.name as Employee,t.salary as Salary from (select* ,DENSE_Rank() over(PARTITION BY departmentId order by salary DESC) as rank_idfrom Employee ) t join Department …

【微处理器系统原理和应用设计第六讲】片上微处理器系统系统架构

一、概念辨析 首先来厘清以下概念:微处理器,微控制器,单片机,片上微处理器系统 (1)微处理器:即MPU(Microprocessor Unit),微处理器是一种计算机的中央处理单…

Linux下快速判断当前终端使用的是bash or csh

在Linux下设置环境变量的时候,可能你也遇到过export: Command not found一类的错误。这是因为当前终端使用的不是bash,如何快速判断当前终端使用的是哪种类型的shell呢? echo $0判断shell类型 最简单的方法就是在终端输入echo $0&#xff0…

Java | Leetcode Java题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> lexicalOrder(int n) {List<Integer> ret new ArrayList<Integer>();int number 1;for (int i 0; i < n; i) {ret.add(number);if (number * 10 < n) {number * 10;} els…

IP/TCP/UDP协议的关键知识点

导语&#xff1a;网络协议是理解网络情况的基础&#xff0c;当遇到网络问题时&#xff0c;首先可以从网络协议入手&#xff0c;熟悉的网络协议可以有效帮助小伙伴们排查或者说定位大概的问题方面。本文整理了目前最常用的网络通信协议&#xff0c;相信对小伙伴们肯定都有帮助。…

单列表集合顶层接口Collection

List&#xff1a;添加元素是有序&#xff0c;可重复&#xff0c;有索引 Set&#xff1a;添加元素是无序&#xff0c;不重复&#xff0c;无索引 Collection是单列集合的祖宗接口&#xff0c;它的功能是全部单列集合都可以继承使用。 1.添加元素 细节1:如果我们要往List系列集…

[项目][CMP][定长内存池]详细讲解

目录 0.铺垫1.理解2.实现 0.铺垫 作为程序员(C/C)我们知道申请内存使用的是malloc&#xff0c;malloc其实就是一个通用的大众货&#xff0c;什么场景下都可以用&#xff0c;但是什么场景下都可以用就意味着什么场景下都不会有很高的性能下面就先设计 一个定长内存池做个开胃菜…

axios返回的是promise对象如何处理?

axios返回的是promise对象如何处理&#xff1f; Axios返回的是Promise对象&#xff0c;这意味着可以使用Promise的.then()、.catch()和.finally()方法来处理异步操作的结果。 以下是处理Axios返回Promise对象的几种常见方式&#xff1a; 1、使用.then()处理响应数据&#xf…

Docker镜像中的源替换为国内源

Docker镜像中的源替换为国内源 介绍示例 介绍 使用Dockerfile构建Containers&#xff0c;通常国内网络更新安装包会有网络问题。本文以python:3.11.7-slim-bookworm镜像为例&#xff0c;实现替换镜像源。 示例 要将基于 python:3.11.7-slim-bookworm 的 Docker 镜像的源替换…

Java IO异常处理:在Web爬虫开发中的实践

在当今的互联网时代&#xff0c;Web爬虫技术已经成为数据采集的重要手段之一。它们能够自动地从网页中提取信息&#xff0c;为数据分析、搜索引擎优化、内容聚合等提供了强大的支持。然而&#xff0c;Web爬虫在执行过程中可能会遇到各种输入/输出&#xff08;IO&#xff09;异常…

假期学习-- iOS runtime的简单了解

iOS RunTime RunTime介绍 RunTime简称运行时&#xff0c;顾名思义&#xff0c;就是oc在运行时侯的一些机制&#xff0c;比如最主要的消息机制 &#xff1b; 对于oc语言来说&#xff0c;它所调用的方法会在运行时才会决定&#xff0c;这就取决于RunTime的消息发送和消息转发机…

集团企业主数据管理项目实施步骤及要点

为打破数据孤岛&#xff0c;提升数据治理水平&#xff0c;某省级投资集团率先构建了主数据平台&#xff0c;并成功实现了财务系统、合同系统、人力资源系统及OA门户系统等多系统的无缝对接。通过主数据平台提供的标准化接口&#xff0c;这些关键业务系统能够高效获取所需的主数…

【知识点】图论续篇 - 最短路算法合集

我不会跟大家说我两个月前就写好了&#xff0c;只是今天才发出来。 本文概述 最短路算法&#xff0c;见名知意&#xff0c;就是用于求出图中从某个顶点到另一个顶点最短距离的算法。最短路算法的应用极其广泛。本文将会以求解最短路为中心&#xff0c;围绕着展开叙述一些常见的…