设计模式 更新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和实际的奖品逻辑区分开了 没有写在一起 ,但是如果奖品种类太多 也会代码过多,通过后续的设计模式来补足。

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

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

相关文章

nlp培训重点

1. SGD梯度下降公式 当梯度大于0时,变小,往左边找梯度接近0的值。 当梯度小于0时,减去一个负数会变大,往右边找梯度接近0的值,此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码,比如写一个小程序使电脑关机&#xf…

基础入门-Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响

知识点: 1、基础入门-Web应用-防护产品-WAF保护 2、基础入门-Web应用-加速服务-CDN节点 3、基础入门-Web应用-文件托管-OSS存储 4、基础入门-Web应用-通讯服务-反向代理 5、基础入门-Web应用-运维安全-负载均衡 一、演示案例-Web-拓展架构-WAF保护-拦截攻击 原理&a…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是,在AI驱动的…

002-日志增强版

日志增强版 一、需求二、引入依赖三、配置日志处理切面四、配置RequestWrapper五、效果展示 一、需求 需要打印请求参数和返回参数 二、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop<…

Spire.PDF for .NET【页面设置】演示:旋放大 PDF 边距而不改变页面大小

PDF 页边距是正文内容和页面边缘之间的空白。与 Word 不同&#xff0c;PDF 文档中的页边距不易修改&#xff0c;因为 Adobe 不提供任何功能供用户自由操作页边距。但是&#xff0c;您可以更改页面缩放比例&#xff08;放大/压缩内容&#xff09;或裁剪页面以获得合适的页边距。…

服务器数据恢复—EVA存储硬盘磁头和盘片损坏离线的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台HP EVA存储中有23块硬盘&#xff0c;挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯&#xff0c;此刻存储还能正常使用。管理员在更换硬盘的过程中&#xff0c;又出现一块硬盘对应的指示灯亮黄…

探索仓颉编程语言:官网上线,在线体验与版本下载全面启航

文章目录 每日一句正能量前言什么是仓颉编程语言仓颉编程语言的来历如何使用仓颉编程语言在线版本版本下载后记 每日一句正能量 当你被孤独感驱使着去寻找远离孤独的方法时&#xff0c;会处于一种非常可怕的状态。因为无法和自己相处的人也很难和别人相处&#xff0c;无法和别人…

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置&#xff0c;可以按下图所示寻找位置&#xff0c;也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly&#xff1a;自动帮我们优化导入的包Optimize imports on the fly&#xff1a;自动去掉一些没有用到的包 禁止导…

【时时三省】(C语言基础)结构体的自引用

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 结构体的自引用 在结构中包含一个类型为该结构体本身的成员是否可以呢&#xff1f; 在struct B里面包含了一个结构体struct A叫sa 结构体类型里面是可以包含另一个结构体类型变量作为它的成…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

宏海科技募资额有所缩减,最大销售和采购都重度依赖美的集团

《港湾商业观察》施子夫 11月29日&#xff0c;北交所上市审核委员会将召开2024年第24次上市委审议会议&#xff0c;届时将审议武汉宏海科技股份有限公司&#xff08;以下简称&#xff0c;宏海科技&#xff09;的首发上会事项。 在上会之前&#xff0c;宏海科技共收到北交所下…

驱动篇的开端

准备 在做之后的动作前&#xff0c;因为win7及其以上的版本默认是不支持DbgPrint&#xff08;大家暂时理解为内核版的printf&#xff09;的打印&#xff0c;所以&#xff0c;为了方便我们的调试&#xff0c;我们先要修改一下注册表 创建一个reg文件然后运行 Windows Registr…

渗透测试--Windows凭证收集

在渗透测试过程中&#xff0c;我们终究会遇到攻陷了某台加域Windows主机的情况。而这种情况下&#xff0c;我们很需要搜集当前主机的凭证信息。为进一步利用这些相互信任的凭证来进行横向打下基础。 在凭证收集中&#xff0c;我们主要有以下场景&#xff1a; 1.lsass.exe的DMP文…

PH热榜 | 2024-12-03

1. Vela OS 标语&#xff1a;利用人工智能&#xff0c;创业投资精准度提升十倍。 介绍&#xff1a;Vela操作系统是一个原生AI操作系统&#xff0c;它能让创业投资者的预测准确率比传统风投公司高出十倍。借助一群AI智能体&#xff0c;投资者可以发现蓬勃发展的市场、公司和人…

微信小程序 运行出错 弹出提示框(获取token失败,请重试 或者 请求失败)

原因是&#xff1a;需要登陆微信公众平台在开发管理 中设置 相应的 服务器域名 中的 request合法域名 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: true, // 默认为网格布局page: 0, // 当前页码size: 10, // 每页大小hasMore…

Google Cloud 混合云部署连接方式最佳实践案例讲解

混合云部署连接方式 GCP 的混合云部署连接方式提供了多种选择&#xff0c;企业可以根据自身需求选择合适的解决方案。实施最佳实践&#xff0c;将有助于提高混合云架构的性能、安全性和可用性。通过合理的规划和管理&#xff0c;企业可以充分利用混合云的优势&#xff0c;实现…

nfs服务器搭建

目录 1&#xff0c;nfs服务端 1&#xff09;安装 2&#xff09;修改nfs配置文件 3&#xff09;创建共享目录 4&#xff09;启动服务nfs配置文件 2&#xff0c;客户端 3&#xff0c;测试 1&#xff09;客户端 2&#xff09;服务端查看 4&#xff0c;systemd实现客户…

从0开始学PHP面向对象内容之常用设计模式(策略,观察者)

PHP设计模式——行为型模式 PHP 设计模式中的行为模式&#xff08;Behavioral Patterns&#xff09;主要关注对象之间的通信和交互。行为模式的目的是在不暴露对象之间的具体通信细节的情况下&#xff0c;定义对象的行为和职责。它们常用于解决对象如何协调工作的问题&#xff…

Python办公——openpyxl处理Excel每个sheet每行 修改为软雅黑9号剧中+边框线

目录 专栏导读背景1、库的介绍①&#xff1a;openpyxl 2、库的安装3、核心代码4、完整代码5、最快的方法(50万行44秒)——表头其余单元格都修改样式总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍…