当前位置: 首页 > news >正文

设计模式--开篇

什么是设计模式

设计模式是软件开发过程中面临的通用问题的解决方案。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性

按使用目的分类

创建型–主要用于创建对象

  1. 单例模式-某个类只能有一个实例,提供一个全局的访问点
  2. 工厂方法模式-创建对象而不将创建逻辑暴露给客户端
  3. 抽象工厂-也称为工厂的工厂,由一个工厂创建其他工厂
  4. 建造者-封装一个复杂对象的构建过程,并可以按步骤构造
  5. 原型-通过复制现有的实例来创建新的实例

行为型–主要用于描述对类或对象怎样交互和怎样分配职责

  1. 访问者—在不改变数据结构的前提下,增加作用于一组对象元素的新功能
  2. 模板方法 --定义一个算法结构,而将一些步骤延迟到子类实现
  3. 策略 --定义一系列算法,把他们封装起来,并且使它们可以相互替换
  4. 状态 --允许一个对象在其对象内部状态改变时改变它的行为
  5. 观察者(事件发布订阅模式) --对象间的一对多的依赖关系
  6. 备忘录 --在不破坏封装的前提下,保持对象的内部状态
  7. 中介者 --用一个中介对象来封装一系列的对象交互
  8. 迭代器 --一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构
  9. 解释器 --给定一个语言,定义它的文法的一种表示,并定义一个解释器
  10. 命令 --将命令请求封装为一个对象,使得可以用不同的请求来进行参数化
  11. 责任链–将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会

结构型–主要用于处理类或对象的组合

  1. 适配器–将一个类的方法接口转换成客户希望的另外一个接口
  2. 桥接模式–将抽象部分和它的实现部分分离,使它们都可以独立的变化
  3. 组合模式–将对象组合成树形结构以表示“部分-整体”的层次结构
  4. 装饰器–动态的给对象添加新的功能
  5. 外观—对外提供一个统一的方法,来访问子系统中的一群接口
  6. 享元模式–通过共享技术来有效的支持大量细粒度的对象
  7. 代理模式–为其他对象提供一个代理以便控制这个对象的访问

按使用范围分类

类模式–处理类和子类之间的关系,这些关系通过继承建立

  1. 工厂方法模式
  2. 类-适配器
  3. 模板方法
  4. 解释器

对象模式–处理对象间的关系,这些关系在运行时刻变化

  1. 抽象工厂
  2. 建造者
  3. 原型
  4. 单例模式
  5. 对象-适配器
  6. 桥接模式
  7. 组合模式
  8. 装饰器
  9. 外观
  10. 享元模式
  11. 代理模式
  12. 责任链
  13. 命令
  14. 迭代器
  15. 中介者
  16. 备忘录
  17. 观察者
  18. 状态
  19. 策略
  20. 访问者

设计模式六大原则

单一原则

一个类只负责一项职责,尽量做到类只有一个行为原因引起变化;
业务对象(BO business object)、业务逻辑(BL business logic)拆分

里氏替换原则

子类可以扩展父类的功能,但不能改变原有父类的功能;
目的:增强程序的健壮性。实际项目中,每个子类对应不同的业务含义,使父类作为参数,传递不同的子类完成不同的业务逻辑

依赖倒置原则

面向接口编程;(通过接口作为参数实现应用场景)
依赖于抽象而不依赖于具体。
抽象就是接口或者抽象类,细节就是实现类
依赖倒置原则定义:
上层模块不应该依赖下层模块,两者应依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口负责定义public属性和方法,并且申明与其他对象依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑

接口隔离

建立单一接口;(扩展为类也是一种接口,一切皆接口)。
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度。
降低依赖,降低耦合。
定义:
客户端不应该依赖它不需要的接口;
类之间依赖关系应该建立在最小的接口上

迪米特原则

最少知道原则,尽量降低类与类之间的耦合;
一个对象应该对其他对象有最少的了解,
即一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立

开闭原则

用抽象构建架构,用实现扩展原则;
开闭原则就是说对扩展开放,对修改关闭。
一个软件实体通过扩展来实现变化,而不是通过修改原来的代码来实现变化。
实现一个热插拔的效果。
开闭原则是对软件实体的未来事件而制定的对现行开发设计进行约束的一个原则

相关文章:

设计模式--开篇

什么是设计模式 设计模式是软件开发过程中面临的通用问题的解决方案。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性 按使用目的分类 创建型–主要用于创建对象 单例模式-某个类只能有一个实例,提供一个全局的访问点工厂方法模式-创建…...

Android 原生进度条ProgressBar【自带】【水平风格】自定义

由于不想从零开始自定义&#xff0c;Android原生的进度条就已经很够用了呀&#xff01; <ProgressBar​android:id"id/pb_storage"​style"style/Widget.AppCompat.ProgressBar.Horizontal"​android:layout_width"match_parent"​android:l…...

Nginx实现tcp代理并支持TLS加密实验

Nginx源码编译 关于nginx的搭建配置具体参考笔者之前的一篇文章&#xff1a;实时流媒体服务器搭建试验&#xff08;nginxrtmp&#xff09;_如何在线测试流媒体rtmp搭建成功了吗-CSDN博客中的前半部分&#xff1b;唯一变化的是编译参数&#xff08;添加stream模块并添加其对应ss…...

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…...

189. 轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…...

com.alibaba:tools:jar com.alibaba:jconsole:jar

com.alibaba:tools:jar com.alibaba:jconsole:jar...

洛谷 P1020 [NOIP1999 普及组] 导弹拦截【一题掌握三种方法:动态规划+贪心+二分】最长上升子序列LIS解法详解

P1020 [NOIP1999 普及组] 导弹拦截 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码动态规划&#xff08;NOIP要求&#xff1a;时间复杂度O(n^2^)&#xff09;贪心二分&#xff08;O(nlgn)&#xff09; 后话额外测试用例样例输入 #1…...

golang的管道阻塞问题

package mainimport ("fmt""sync"//"time" ) var wg sync.WaitGroup func writeData(intchan chan int){defer wg.Done()for i : 1; i < 9; i {intchan<-ifmt.Println("写入的数据为&#xff1a;",i)//time.Sleep(time.Seco…...

用HTML + javaScript快速完成excel表格信息除重并合并

今天突然接到一个工作&#xff0c;要把两个存储在.xls的主体信息表&#xff0c;除重后合并成一个主体信息表&#xff0c;并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多&#xff0c;如果信息表中的信息量不大的话&#xff0c;手工处理一下也行&#xff0c;如…...

高性能网络编程 - The C10M problem

文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里&#xff0c;因为IPv6协议下每个服务器的潜在连接数都是数以百万级的&#xff0c;单机服务器处理数百万的并发连接&#xff0…...

java计算机毕业设计SpringBoot在线答疑系统

项目介绍 本文从学生的功能要求出发&#xff0c;建立了在线答疑系统&#xff0c;系统中的功能模块主要是实现管理员权限&#xff1b;首页、个人中心、学生管理、教师管理、问题发布管理、疑难解答管理。教师权限&#xff1a;首页、个人中心、疑难解答管理、试卷管理、试题管理…...

Doc as Code (4):使用Git做版本管理,而不是使用目录做版本管理

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 在引入版本管理工具之前&#xff0c;文档工程师使用文件系统提供的功能来管理文件。大家是这样工作的&#xff1a; 文件按照分类放在不同的目录里&#xff0c;使用编辑器&#xff08;如&#xff1a;MS Word&#xff09;打开文档进…...

【Codeforces】 CF1870E Another MEX Problem

题目链接 CF方向 Luogu方向 题目解法 解法1 考虑优化 d p dp dp 转移次数&#xff0c;即只转移有用的区间 不难发现&#xff0c; m e x ( l , r ) m e x ( l 1 , r ) mex(l,r)mex(l1,r) mex(l,r)mex(l1,r) 或 m e x ( l , r ) m e x ( l , r − 1 ) mex(l,r)mex(l,r-1…...

【Objective-C】Objective-C汇总

方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数

怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数 需求分析&#xff1a; 1.统计性别为女性的所获学位下不同学历层次的人数 2.统计不同职务职称的不同学位和学历层次的人数代码 def cal_xuewei_number(self):# 读取表格文件table pd.read_excel("…...

浅谈Elasticsearch查询和搜索

Elasticsearch查询和搜索 Elasticsearch是一个分布式、实时的搜索和分析引擎&#xff0c;广泛应用于全文搜索、日志分析、实时数据分析等场景。Elasticsearch提供了丰富的查询和搜索功能&#xff0c;如查询DSL、过滤、排序、分页、高亮和聚合等。本文将详细介绍如何在Elastics…...

SLAM从入门到精通(被忽视的基础图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业上用激光slam的多&#xff0c;用视觉slam的少&#xff0c;这是大家都知道的常识。毕竟对于工业来说&#xff0c;健壮和稳定是我们必须要考虑的…...

【C++】继承详解

本篇要分享的内容是关于继承的内容哼哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊 以下为本篇目录 目录 1.简单了解继承 2.继承的简单定义 3.继承简单使用 4.继承方式 4.1基类的privat 4.2基类的protected 4.3不可见与private的区别 5.父子类对象赋值转换 6.继承的作用域 7.子…...

react:swr接口缓存

useSWR 是一个 React Hooks&#xff0c;是 HTTP 缓存库 SWR 的核心方法之一。SWR 是一个轻量级的 React Hooks 库&#xff0c;通过自动缓存数据来实现 React 的数据获取。 第一个参数是被缓存的数据的 key&#xff0c; 第二个参数是一个函数&#xff0c;该函数返回数据或者一个…...

2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python

这里以鞠婧祎的个人主页为demo https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 【2023-11-4 23:02:52 星期六】可能后面随着XX的调整, 方法不再适用, 请注意 找到接口 找到https://www.douyin.com/aweme/v1/web/…...

前端包管理器原理

前端包管理器原理探秘 在现代前端开发中&#xff0c;包管理器是不可或缺的工具&#xff0c;它们帮助开发者高效管理项目依赖、解决版本冲突&#xff0c;并优化资源加载。无论是npm、Yarn还是pnpm&#xff0c;其核心原理都围绕依赖解析、存储优化和安装策略展开。本文将深入探讨…...

spring-boot-starter-validation字段数据校验

validation 概述 spring-boot-starter-validation 是 Spring Boot 官方提供的用于数据校验的启动器&#xff0c;它基于 Bean Validation API (JSR 380) 标准&#xff0c;并默认使用 Hibernate Validator 作为其实现。这个框架能让你通过声明式的注解&#xff0c;轻松地对控制器…...

Unity转H5广告避坑指南:Luna Playable插件实战踩坑与替代方案

Unity转H5广告避坑指南&#xff1a;Luna Playable插件实战踩坑与替代方案 在移动游戏营销领域&#xff0c;可玩广告&#xff08;Playable Ads&#xff09;已成为提升转化率的关键利器。对于使用Unity开发的中小团队而言&#xff0c;如何高效地将现有游戏转化为H5可玩广告&#…...

STM32H743外挂W5500做UDP通信,一个Socket端口如何同时处理多个客户端数据?

STM32H743与W5500实现单Socket多客户端UDP通信的实战解析 在嵌入式网络通信中&#xff0c;UDP协议因其低开销和实时性优势被广泛应用于设备间数据传输。本文将深入探讨STM32H743通过W5500以太网模块实现单Socket端口同时处理多客户端数据的解决方案&#xff0c;相比传统多Socke…...

怎么删除MongoDB中不再使用的账号

db.dropUser()用于删除指定数据库中的用户&#xff0c;需先use目标库&#xff0c;用户名区分大小写&#xff0c;返回true表示成功&#xff0c;false通常因用户不存在或库不匹配。用 db.dropUser() 删除指定账号MongoDB 没有“禁用账号”概念&#xff0c;删就完了。核心操作就是…...

解锁论文降重新姿势:书匠策AI,你的学术减负小能手!

在学术的浩瀚海洋中&#xff0c;每一位学者或学生都像是勇敢的航海者&#xff0c;驾驶着知识的船只&#xff0c;探索未知的领域。然而&#xff0c;在撰写论文这一航程中&#xff0c;有一个让人头疼的“暗礁”——重复率过高。它不仅可能让你的辛勤努力付诸东流&#xff0c;还可…...

csp基础知识——分治、查找与排序

分治分治是一种思想&#xff0c;具体是在解决某类问题的一种解决思路&#xff0c;常常在排序算法中使用。当然用一个具体的例子可以快速了解一下。假设在一堆&#xff08;n个&#xff09;质量相同的真硬币中混入了一枚质量较轻的假硬币&#xff0c;现在要找出来&#xff0c;常规…...

企业级5G安全流量卸载方案与DPU加速实践

1. 企业级5G安全流量卸载方案概述在边缘计算和私有5G网络快速普及的当下&#xff0c;企业面临着前所未有的安全挑战。根据Palo Alto Networks最新威胁报告显示&#xff0c;针对5G核心网的AI驱动型攻击在2023年同比增长了217%&#xff0c;传统安全架构已难以应对这种实时演变的威…...

Phi-4-mini-reasoning企业落地:保险条款自动推理与理赔逻辑校验系统

Phi-4-mini-reasoning企业落地&#xff1a;保险条款自动推理与理赔逻辑校验系统 1. 项目背景与价值 保险行业长期面临两大核心痛点&#xff1a;复杂的条款解读和繁琐的理赔审核。传统人工处理方式存在效率低、成本高、标准不统一等问题。Phi-4-mini-reasoning模型凭借其强大的…...

PPT模板自动化:YAML+LLM实现企业级报告批量生成

1. 项目概述&#xff1a;当PPT模板遇上YAML与LLM如果你和我一样&#xff0c;经常需要基于公司统一的PPT模板&#xff0c;批量生成几十甚至上百份内容相似但数据不同的演示文稿&#xff0c;那你一定懂那种痛苦。手动复制粘贴、修改文字、更新图表数据、调整表格&#xff0c;不仅…...