设计模式分享

2. 策略模式

2.1 定义:策略模式定义了家族算法,分别封装起来(这些算法完成的都是相同的工作,只是实现不同),它可以用相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。此模式让算法的变化不会影响到其他算法的用户

2.2 策略模式结构图

在这里插入图片描述

2.3 策列模式的优点:

2.3.1 策略模式的Strategy类层次为Context定义了一系列的可供重用的的算法或行为,继承有利于析取出这些算法中的公共功能。
2.3.2 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

2.4 使用场景:当分析过程中,听到不同时间应用不同的业务规则,就可以考虑用策略模式处理这种变化的可能性。但是使用策略模式,没有减少给客户端判断业务规则类型的压力,使用工厂+策略模式可以缓解压力

3. 单一职责原则

3.1 定义:就一个类而言,应该仅有一个引起它变化的原因

3.2 原因:如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化,可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受意想不到的变化。

4. 开放封闭原则

4.1 定义:软件实体(类,模块,函数等等)应该可以扩展,但是不可修改

4.2 特征:对扩展开放,对更改关闭。 (面对需求,对程序的改动时通过新增代码实现,而不是修改原有的代码)

4.3 案例结构图

在这里插入图片描述

5. 依赖倒置原则(依赖倒转原则)

5.1 定义:高层模块不应该依赖低层模块,两个都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。(简单来说,就是面向接口编程)

在这里插入图片描述

6. 里氏替换原则

6.1 定义:子类型必须可以替换掉他们的父类型

7. 装饰模式

7.1 定义:动态的给一个对象添加额外一些的职责,就增加功能来说,装饰模式比生成子类更为灵活。

在这里插入图片描述

8. 代理模式

8.1 定义:为其他对象提供一种代理,以控制对这个对象的访问

在这里插入图片描述

8.2 应用:

8.2.1 远程代理:为一个对象在不同的地址空间提供局部代理,这样可以隐藏一个对象存在于不同空间的事实
8.2.2 虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
8.2.3 安全代理:用来控制真实对象访问时的权限
8.2.4 智能指引:是指当调用真实对象时,代理处理另外一些事

9. 原型模型

9.1 定义:用原型实例指定创建对象的实例,并通过拷贝这些原型创建新的对象。

在这里插入图片描述

10. 模板模型

10.1 定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类。模板方法使得子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤。

在这里插入图片描述

11 迪米特法则(最少知识原则)

11.1 定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三方转发这个调用。

12 外观模式

12.1 为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

在这里插入图片描述

13 建造者模式

13.1 定义:将一个复杂对象的构建跟它的表示分离,使得同样的构建过程可以创建不同的表示。

在这里插入图片描述

14 观察者模式(发布-订阅模式)

14.1 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们可以自动更新自己

在这里插入图片描述

15 抽象工厂

15.1 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的实现类。

在这里插入图片描述

16 状态模式

16.1 定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类

在这里插入图片描述

16.2 使用场景:当一个对象的行为取决于它的状态,并且必须在运行时刻根据状态改变它的行为时

17 适配器模式

17.1 定义:将一个类的接口转化为客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起使用的类可以一起使用

在这里插入图片描述

18 备忘录模式

18.1 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象还原成之前的状态

在这里插入图片描述

19 组合模式

19.1 定义:将对象组合成树形结构以表示 部分与整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

在这里插入图片描述

19.2 透明方式:叶节点和枝节点具有完全一致的接口行为(叶节点也具有添加和删除子节点的方法),对于外界没有区别
19.2 安全方式:叶节点没有删除和添加子节点的方法。叶节点和枝节点接口不一致,外界调用需要做判断
19.3 使用场景:需要体现整体与部分层次结构的时候,以及你希望用户忽略组合和单个对象的的不同,统一的使用组合结构中所有的对象时。

20 迭代器模式

20.1 定义:使用一种方案顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示

在这里插入图片描述

21 单例模式

21.1 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点

在这里插入图片描述

21.2 应用:考虑并发的情况,饿汉模式创建对象,使用双重锁定

在这里插入图片描述

22 合成/聚合复用原则

22.1 定义:尽量使用合成/聚合,尽量不要使用类继承

23 桥接模式

23.1 定义:将抽象部分和它的实现部分 分离,使它们都可以独立的变化

24 命令模式

24.1 定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

25 职责链模式

25.1 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

在这里插入图片描述

26 中介者模式

26.1 定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

在这里插入图片描述

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

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

相关文章

Python实战开发及案例分析(25)—— 爬山算法

爬山算法(Hill Climbing)是一种启发式搜索算法,常用于解决优化问题。它的核心思想是从一个初始解开始,不断朝着增益最大的方向移动,直到达到局部最优解。 实现步骤 从初始解开始。在当前解的邻域中找到一个更好的解。…

LeetCode109:组合总和Ⅳ

题目描述 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 解题思想 使用完全背包 代码 /*dp[i]:表示装满容量为i的背包有dp[i]种方…

高通QCS6490开发(二)AI板卡接口

QCS6490是高通公司针对高端物联网终端而优化的SoC,在性能和功耗上有最优的平衡。《高通QCS6490 AIoT应用开发》是一系列AIoT应用开发文章,介绍如何基于QCS6490平台做AIIoT的应用开发。 本文主要介绍FV01开发板的内部和外部接口。 内部的板载接口如下 接口…

天锐绿盾 | 设计院、机械制造行业透明加密cad图纸、图纸防泄密软件

天锐绿盾为设计院及机械制造行业量身打造的透明加密CAD图纸解决方案,专注于保障这些行业中的核心资产—设计图纸的安全。通过集成先进的加密技术和访问控制策略,该软件系统能有效防止图纸的未经授权访问和意外泄密。 PC地址: https://isite…

每日一练 2024.5.16 (补 2024.5.15)

题目: 给定一个 正整数 数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 袋子中(即 至少还有一颗 魔法豆的袋子)…

2024汽车行业用户洞察与营销趋势白皮书

来源:小红书&寰球汽车:

设备接入物联网平台必须掌握的关键信息——青创智通

工业物联网解决方案-工业IOT-青创智通 设备接入物联网平台需要掌握的信息相当丰富且复杂,这涉及到多个层面,包括技术细节、平台选择、安全性考虑以及后期管理与维护等。以下将详细阐述设备接入物联网平台所需掌握的关键信息。 首先,我们需要…

【recast-navigation-js】通过websocket获取navmesh数据并初始化

目录 说在前面目录结构websocket服务器前端结果 说在前面 操作系统:windows 11浏览器:edge版本 124.0.2478.97recast-navigation-js版本:0.29.0golang版本:1.21.5 目录结构 D:. │ go.mod │ go.sum │ main.go // websocket …

Halcon 根据XYZ生成3D模型

Halcon 根据XYZ生成3D模型 x_points := [a_x_points, b_x_points, c_x_points]y_points := [a_y_points, b_y_points, c_y_points]z_points := [a_z_points, b_z_points, c_z_points]stop()gen_object_model_3d_from_points

风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码) 基于遗传算法优化BP神经网络是一种常见的方法,用于改进BP神经网络在风电功率预测中的性…

JavaScript-基本数据类型和变量

基本数据类型 JavaScript支持数字、字符串和布尔值3种基本数据类型 字符串型 字符串型是JavaScript用来表示文本的数据类型,字符串通常由单引号或双引号括起来,如果字符串存在特殊字符,可以用转义字符代替 数字型 数字型也是JavaScript中的基…

【数据链路层】以太网帧包解析

文章目录 以太网的帧结构解析数据链路层信息 以太网的帧结构 使用抓包工具,查看数据链路层信息: 解析数据链路层信息 (1)协议类型:代表上层的协议 (IP00800 ARP00806 IPv686DD ) 如图中所示&a…

金蝶AAS-V9.0前后端部署

前言 包含金蝶AAS9.0部署,前端部署,后端部署。 金蝶AAS9.0部署 1. 下载金蝶AAS9.0安装包上传至服务器; 2. 解压安装包; unzip -d /opt/AAS-V9.0 AAS-V9.0.zip3. 配置JAVA路径; echo $JAVA_HOME vim /opt/AAS-9.0…

力扣HOT100 - 32. 最长有效括号

解题思路&#xff1a; 栈 class Solution {public int longestValidParentheses(String s) {int max 0;// 也可以使用 Stack<Integer> stacknew Stack<>();但Stack是遗留类&#xff0c;不推荐Deque<Integer> stack new LinkedList<>();stack.push(…

怎么做微信在线预约

在快节奏的现代生活中&#xff0c;我们总是追求更高效、更便捷的服务体验。而微信&#xff0c;这个拥有数亿用户的社交平台&#xff0c;早已不仅仅是一个聊天工具&#xff0c;它更是一个融合了多种功能的综合性服务平台。今天&#xff0c;就让我们一起探讨如何通过微信在线预约…

线程池的一些问题

核心线程数1.最大线程5.队列5.存活时间10s 1.场景一 如果核心线程数.被一直占用得不到释放.新进来1个任务.会怎么样?答: 会在队列中中死等. 只要进来的任务.不超过队列的长度,就会一直挡在队列中死等 package com.lin;import java.util.concurrent.Executors; import java.u…

通过阿里云的PAI基于开源LLM搭建RAG检索增强对话系统

5月9日参加阿里云AI云峰会活动&#xff0c;学习了下如何借助阿里云的PAI服务进行搭建RAG检索增加对话系统。 前提&#xff1a; 为了方便省钱&#xff0c;建议先通过免费的优惠圈&#xff0c;这样就可以先不花钱学习一下啦。开始实验之前&#xff0c;请务必打开 阿里云免费试用…

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem&#xff0c;继上一章节讲过qt中如何编译freetype Qt编译和使用freetype矢量字库方法https://blog.csdn.net/wangningyu/article/details/138927379#QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览…

【SpringBoot】SpringBoot3-基本介绍

目录 环境基本介绍pom.xml启动器依赖管理机制分析为什么导入starter-web所有相关依赖都导入进来&#xff1f;为什么版本号都不用写&#xff1f;自定义版本号第三方的依赖 总结 自动配置机制理解默认的包扫描规则配置默认值按需加载自动配置总结 自动配置流程问题流程步骤流程总…

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…