设计模式 更新ing
设计模式
- 1、六大原则
- 1.1 单一设计原则 SRP
- 1.2 开闭原则
- 1.3 里氏替换原则
- 1.4 迪米特法则
- 1.5 接口隔离原则
- 1.6 依赖倒置原则
- 2、工厂模式
1、六大原则
1.1 单一设计原则 SRP
一个类应该只有一个变化的原因
比如一个视频软件,区分不同的用户级别 包括访客,普通用户,VIP用户,每个用户对应的方法具体实现是不同的,根据用户级别的不同,有不同的行为。
最简单的想法:我们可能会把它放到ifelse里边
比如:
package com.example.demo;/*** @ClassName VedioUser* @Description TODO* @Author lukcy* @Date 2024/12/1 15:53* @Version 1.0*/
public class VedioUser {public void VedioUserTest(String UserType){if(UserType.equals("访客")){System.out.println("访客,480p");}else if(UserType.equals("普通用户")){System.out.println("普通用户,720p");}else if(UserType.equals("Vip用户")){System.out.println("Vip用户,1080p");}}
}
package com.example.demo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DemoApplicationTests {@Testvoid contextLoads() {VedioUser vedioUser=new VedioUser();vedioUser.VedioUserTest("Vip用户");}}
使用SRP的话 先定义一个接口 然后定义三个实现类
package com.example.demo;/*** @ClassName IVedioUser* @Description TODO* @Author lukcy* @Date 2024/12/1 16:10* @Version 1.0*/
public interface IVedioUser {void content();void guanggao();
}
package com.example.demo.Impl;import com.example.demo.IVedioUser;
import org.springframework.stereotype.Component;/*** @ClassName VipUser* @Description TODO* @Author lukcy* @Date 2024/12/1 16:10* @Version 1.0*/
@Component
public class VipUser implements IVedioUser {@Overridepublic void content() {System.out.println("vip用户,1080p");}@Overridepublic void guanggao() {System.out.println("vip用户,没有广告");}
}

这里只实现了一个,类比即可,我们可以看出,每个类都有了类似的行为,但是一个类型对应不同的类。
1.2 开闭原则
扩展开放,修改关闭
比如:
我们有一个需求 是计算圆形,矩形的面积
定义了一个接口,并且有了一个实现类,且这里的Π定义的是3.14,目前有一个新的需求就是需要一个Π是3.1415926的计算圆形的类,我们不想修改之前实现的类,那么我们可以进行扩展,定义一个新的类去继承该开始的类,只扩展圆形的面积即可。
两者互不影响


1.3 里氏替换原则
里氏替换原则更多的是强调子类在继承父类时,不应该改变父类的行为或破坏父类的契约,以保证替换的可行性。
开闭原则则强调在不修改现有代码的情况下,通过新增代码来扩展系统的功能。它要求通过扩展现有类或接口来实现新功能,而不是修改已有类。
1.4 迪米特法则
减少知道,减少干预。
比如学生,老师和校长,
校长专注于每一个平均分其实也就可以了,没必要关注到每个学生。
让老师管理对应的班级,并且提供班级平均分等方法即可。
1.5 接口隔离原则
就是分为小的接口,可以有不同的组合实现。
比如唱歌跳舞演戏。如果我们定为一个接口
其他演员来实现时就要全部实现,即使有的技能他没有,那需要特定标识来提示。
所以我们可以把唱歌,跳舞,演习分为三个接口,然后之后多接口实现就好。
1.6 依赖倒置原则
比如上级和下级,上级应该提出一个抽象接口,然后下级按照该接口来实现,上级只需要去调用不同部门对该接口的实现类即可。这样就是依赖倒置原则,而不是说上级去依赖于下级的具体实现,应该面向抽象编程而不是面向实现编程。
比如一个抽奖 有随机抽奖和权重抽奖
我们只需要定义一个接口 有一个抽奖方法就好
接下来有两个实现类 一个随机抽奖类 一个权重抽奖类 都要实现该接口。
最后有一个专门的类 去调用不同的实现
参数传入接口类型即可,实际的形参时再传入具体的实现类,我们不用关注具体细节,只用关注抽象的类即可。

如果不用这个 就会变成下边这种 关注于具体的实现,调用时也要关注具体的实现,而不是关注于抽象。

2、工厂模式
比如一个 发放奖品的业务
奖品有爱奇艺会员,卡券等,如果不用工厂模式,那么我们想到的可能就是ifelse
比如:这里我们不仅需要new不同的奖品,而且new奖品之后的逻辑也同样写在这里,之后如果奖品增加,ifelse又会增多

如果我们运用工厂模式
首先需要设计一个接口
之后每个奖品都要实现该接口

在这里 实现了单一原则 一个类负责一个接口 并且之后有拓展的话 可以直接继承该接口进行拓展 实现开闭原则 同时 new和实际的奖品逻辑区分开了 没有写在一起 ,但是如果奖品种类太多 也会代码过多,通过后续的设计模式来补足。
相关文章:
设计模式 更新ing
设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客࿰…...
Elasticsearch 进阶
核心概念 索引(Index) 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索…...
【AI】Sklearn
长期更新,建议关注、收藏、点赞。 友情链接: AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线:机器学习->深度学习->强化学习 目录 预处理模型选择分类实例: 二分类比赛 网格搜索实例&…...
通过 JNI 实现 Java 与 Rust 的 Channel 消息传递
做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集,不是子女的前传,更不是朋友的外篇。对待生命你不妨再大胆一点,因为你好歹要失去它。如果这世上真有奇迹,那只是努力的另一个名字”。 一、crossbeam_channel 参考 crossbeam_channel - Rust crossbeam_channel…...
【老白学 Java】对象的起源 Object
对象的起源 Object 文章来源:《Head First Java》修炼感悟。 上一篇文章中,老白学习了抽象类和抽象方法,不禁感慨,原来 Java 还可以这样玩。 同时又有了新的疑问,这些父类从何而来的? 本篇文章老白来聊一聊…...
Ubuntu Linux操作系统
一、 安装和搭建 Thank you for downloading Ubuntu Desktop | Ubuntu (这里我们只提供一个下载地址,详细的下载安装可以参考其他博客) 二、ubuntu的用户使用 2.1 常规用户登陆方式 在系统root用户是无法直接登录的,因为root用户的权限过…...
SpringBoot 打造的新冠密接者跟踪系统:企业复工复产防疫保障利器
摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…...
嵌入式Linux(SOC带GPU树莓派)无窗口系统下搭建 OpenGL ES + Qt 开发环境,并绘制旋转金字塔
树莓派无窗口系统下搭建 OpenGL ES Qt 开发环境,并绘制旋转金字塔 1. 安装 OpenGL ES 开发环境 运行以下命令安装所需的 OpenGL ES 开发工具和库: sudo apt install cmake mesa-utils libegl1-mesa-dev libgles2-mesa-dev libdrm-dev libgbm-dev2. 安…...
webGL入门教程_06变换矩阵与绕轴旋转总结
变换矩阵与绕轴旋转总结 目录 1. 变换矩阵简介2. 平移矩阵3. 缩放矩阵4. 旋转矩阵 4.1 绕 Z 轴旋转4.2 绕 X 轴旋转4.3 绕 Y 轴旋转 5. 组合变换矩阵6. 结论 1. 变换矩阵简介 在计算机图形学中,变换矩阵用于在三维空间中对物体进行操作,包括ÿ…...
生成树详解(STP、RSTP、MSTP)
目录 1、STP 1.概述 2.基本概念 3.端口角色及其作用 4.报文结构 5.STP的端口状态 6.三种定时器 7.STP选举步骤 8.配置BPDU的比较原则 9.TCN BPDU 10.临时环路的问题 11.传统STP的不足 拓扑变更处理过程 2、RSTP 1.端口角色 2.端口状态 3.P/A(Propo…...
【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析
【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析 一、QNX 侧触摸屏配置基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Android虚拟化方案】00 - 系列文章链接汇总》 本文链接:《【…...
C#中的集合初始化器
C#中的集合初始化器是一种简洁的语法,允许在声明集合的同时初始化其元素。这种语法特别适用于初始化实现了IEnumerable接口并具有Add方法的集合类型,如List<T>、Dictionary<TKey, TValue>等。 集合初始化器的基本用法 集合初始化器的基本语…...
cartographer建图与定位应用
文章目录 前言一、安装cartographer1.安装环境2.源码编译2.1 下载2.2 编译 二、gazebo仿真2d建图0.准备仿真环境1.编写lua文件2.编写启动文件3.建图保存 三、cartographer定位 move_base导航3.1 编写启动文件3.2 启动launch 总结 前言 本文介绍cartographer在ubuntu18.04下的…...
专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人
专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 在使用 ROS(Robot Operating System)进行开发时,通常会涉及多个 Catkin 工作空间(Catkin Workspace)。这些工作空间包含不同的 ROS 包和节点,可能相互…...
Apache Doris 现行版本 Docker-Compose 运行教程
特别注意!Doris On Docker 部署方式仅限于开发环境或者功能测试环境,不建议生产环境部署! 如有生产环境或性能测试集群部署诉求,请使用裸机/虚机部署或K8S Operator部署方案! 原文阅读:Apache Doris 现行版…...
Flink四大基石之窗口(Window)使用详解
目录 一、引言 二、为什么需要 Window 三、Window 的控制属性 窗口的长度(大小) 窗口的间隔 四、Flink 窗口应用代码结构 是否分组 Keyed Window --键控窗 Non-Keyed Window 核心操作流程 五、Window 的生命周期 分配阶段 触发计算 六、Wi…...
NGINX配置https双向认证(自签一级证书)
一 生成自签证书 以下是生成自签证书(包括服务端和客户端的证书)的步骤,以下命令执行两次,分别生成客户端和服务端证书和私钥。具体执行可以先建两个目录client和server,分别进入到这两个目录下执行下面的命令。 生成私钥: 首先&…...
Flink双流Join
在离线 Hive 中,我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢?Flink DataStream API 为我们提供了3个算子来实现双流 join,分别是: join coGroup intervalJoin 下面我们分别详细看一下这…...
【数据结构实战篇】用C语言实现你的私有队列
🏝️专栏:【数据结构实战篇】 🌅主页:f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构,本期内容我们将实现队列的数据结构 一、队列的概念 队列:只允许在一端进行插入数据操作,在另一端…...
基于web的海贼王动漫介绍 html+css静态网页设计6页+设计文档
📂文章目录 一、📔网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站演示 五、⚙️网站代码 🧱HTML结构代码 💒CSS样式代码 六、🔧完整源码下载 七、📣更多 一、&#…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
