C#.Net学习笔记——设计模式六大原则
***************基础介绍***************
1、单一职责原则
2、里氏替换原则
3、依赖倒置原则
4、接口隔离原则
5、迪米特法原则
6、开闭原则
一、单一职责原则
举例:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。
总结:一个类只负责一件事
1、情况
这里我们封装了一个动物类,写上两个方法,呼吸和行为。
运行方法
这里我们构造函数传入“鱼”的话,这样就不符合逻辑了
2、简单案例
我们把Animal类抽象为父类,然后把鸟、鱼等动物作为子类,去继承Animal。每个动物类内去重写各自的方法。互不影响。这就是单一职责原则
3、优点
一个类只负责一件事,拆分之后,职责变得单一。
阅读简单,易于维护。
扩展升级,减少修改,直接增加类。
方便代码重用。
4、缺点
类变多了,上端需要了解更多的类
5、使用时机
衡量着使用:如果类相对稳定,拓展变化少,而且逻辑简单,违背单一职责也没关系。 一个类不要让它太冗长
如果不同的职责,总是一起变化的,这种是一定要分开的。
6、举例
方法:方法多个分支,还可能拓展变化,最好分开多个方法
类:接收输入——数据验证——逻辑计算——数据库操作——日志,方便维护升级
接口:也会把不同的功能接口独立开来
类库:把项目拆分多个类库,重用——方便维护
项目:一个Web解决所有问题:客户端;管理后台;定时服务;远程接口;
二、里氏替换原则
基本:任何使用基类的地方,都可以透明的使用其子类
继承、多态
继承:通过继承,子类拥有父类的一切属性和行为,任何父类出现的地方,都可以用子类来代替
1、子类必须完全实现父类的方法,如果子类没有父类的某项东西,就断掉继承
2、子类可以有父类没有的东西,所以子类出现的地方,不一定能用父类来代替
3、透明(安全),父类的东西换成子类后不影响程序。
4、尽量不要new父类写完的方法,最好选择使用virtual和override的方式,避免埋雷
声明变量、参数、属性、字段最好都是基于基类的。
小题目:抽象类的父类有三个方法,Test01是普通方法,Test02是虚方法,Test03是抽象方法。子类继承了父类,重写了这3个方法。在实例化了子类后调用三个方法,调用的会是谁的方法?
答案是:父类、子类、子类
1、普通方法由左边决定,编译时决定
2、虚方法和抽象方法由右边决定,运行时决定
三、迪米特法则(最少知道原则)
基础:
1、一个对象应该对其他对象保持最少的了解。
2、面向对象——类——类与类之间会有交互——功能模块——系统
3、高内聚,低耦合。高度封装,类与类之间减少依赖
耦合关系:依赖、关联、组合、聚合 继承、实现接口。
4、只与直接的朋友通信
5、去掉内部依赖——降低访问修饰符
举例:我们有三个类,分别是学校类(School)、课室类(Class)和学生类(Student),课室中有学生,学生和学校没有直接联系,则学生是学校的依赖(间接关系)
学校的管理方式:
1、学校让班级自己去管理学生(符合迪米特法则)
2、学校直接管理所有学生(不符合迪米特法则)
参考示例:
四、依赖倒置原则
1、基础:上层模块应该依赖于底层模块,二者应该通过抽象依赖
依赖抽象,而不是依赖细节
小案例:我有一个手机基类,子类分别有IPhone类和HuaWei类,还有一个Student学生类,学生类可以玩IPhone和HuaWei手机,因此我们写了两个方法,可以传入两种手机的参数。但是如果我们希望后续给学生拓展更多的手机,那我们就要写更多的方法?
这种其实在方法里直接传入手机子类,其实算是依赖细节。
其实我们可以写一个方法,参数为手机基类(依赖抽象):
1、依赖抽象更具有通用性,而且具备拓展性。
2、细节是多变的,抽象是稳定的;系统架构基于抽象来搭建,会更加具备拓展性
3、面向抽象编程,底层模块里面尽量都有抽象类/接口
4、在声明参数/变量/属性的时候,尽量都是 接口/抽象类
五、接口隔离原则
1、基础:客户端不应该依赖它不需要的接口;
一个类对另一个类的依赖应该建立在最小的接口上;
实现一个接口的时候,只需要自己必须的功能;
小案例:还是用上边手机的案例,我们刚刚通过抽象类来描述我们的手机,那对于我们手机的功能我们可以使用接口,抽象类主要用于是什么,接口主要用于干什么。
这里我写了一个接口,只需要继承这个接口,我们的手机就有打电话、上网、玩游戏等功能。但假如有一天我们需要假如一台老人机,而老人机并没有上网、玩游戏等功能,而我们这个接口就必须实现接口内的所有方法,这时候就不太合适了。最好的方法是把接口隔离开,比如所有手机都可以打电话,发短信,那么打电话和发短信就可以单独写一个接口,其他智能机才有的功能另外写一个接口。我们需要用什么接口就继承什么接口即可。
六、开闭原则
1、基础:1、对拓展开发,对修改关闭
2、如果有功能拓展变化的需求,希望是增加类而不是修改。
3、修改会影响原有功能,引入错误
4、增加类就不会影响原有的东西
5、原则的原则,五大原则是手段,开闭原则是目标
相关文章:
C#.Net学习笔记——设计模式六大原则
***************基础介绍*************** 1、单一职责原则 2、里氏替换原则 3、依赖倒置原则 4、接口隔离原则 5、迪米特法原则 6、开闭原则 一、单一职责原则 举例:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修…...
go 修改postgresql的配置参数
postgresql.conf与postgresql.auto.conf的区别 postgresql.auto.conf的优先级高于postgresql.conf,如果一个参数同时存在postgresql.auto.conf和postgresql.conf里面,系统会先读postgresql.auto.conf的参数配置。 使用alter system set修改的是postgres…...
解决word图片格式错乱、回车图片不跟着换行的问题
解决word图片格式错乱、回车图片不跟着换行的问题 1.解决方法。 先设置为嵌入型 但是设置的话会出现下面的问题。图片显示不全。 进一步设置对应的行间距,原先设置的是固定值,需要改为1.5倍行距的形式,也就是说不能设置成固定值就可以。...
密码学(二)
文章目录 前言一、Certificate Authorities二、Key Agreement Protocols 前言 本文来自 Intel SGX Explained 请参考:密码学(一) 一、Certificate Authorities 非对称密钥密码学中的公钥和私钥假设每个参与方都拥有其他参与方的正确公钥。…...
mysql进阶-视图
目录 1. 用途 2. 语法 2.1 创建或替换视图 2.2 修改视图 2.3 查看视图: 2.4 删除视图: 3. 其他 3.1 操作视图 3.2 迁移数据库 1. 用途 视图可以理解为一个复杂查询的简称,它可以帮助我们简化查询,主要用于报表查询:例如…...
力扣-34. 在排序数组中查找元素的第一个和最后一个位置
文章目录 力扣题目代码 力扣题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算…...
Cesium笔记 初始化 使用Vue-Cesium 组件
参考 A Vue 3 based component library of CesiumJS for developers | Vue for CesiumVue for Cesium, a Vue 3.x based component library of CesiumJS for GISerhttps://zouyaoji.top/vue-cesium/#/zh-CN/component/quickstart...
QTday2作业
思维导图: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数; 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断u界面上输入的账号是否为"admin",…...
scVI与MultiVI
scVI:https://docs.scvi-tools.org/en/stable/user_guide/models/scvi.html MultiVI:https://docs.scvi-tools.org/en/stable/user_guide/models/multivi.html 目录 scVI生成推理任务 MultiVI生成推理 scVI single cell variational inference提出了一个…...
java Servlet体育馆运营管理系统myeclipse开发mysql数据库网页mvc模式java编程计算机网页设计
一、源码特点 JSP 体育馆运营管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统采用serlvetdaobean,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。 java Servlet体育馆运营管理系…...
2、UML类图
UML(Unified Modeling Language)统一建模语言,用来进行设计软件的可视化建模语言。 2.1 类图概述 类类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及他们与其他类的关系等。类图是面向对象建模的主要组成部分。 2.…...
2023 年度合辑 | 出海大年的全球化产品洞察和服务动向
2023 年度合辑 年度关键词 出海&全球化 出海 & 全球化通信服务全面升维 出海大年,融云全球互联网通信云作为“全球化最佳基础设施”之一,发挥技术沉淀和实践积累带来的核心优势,结合市场变化对出海 & 全球化通信服务进行了全方位…...
python 基础笔记
基本数据类型 函数 lamda 匿名函数 成员方法 类 类与对象 构造方法 魔术方法 私有成员 私有方法 继承 注解 变量注解 函数注解 Union类型 多态 参考链接:黑马程序员python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilib…...
[原创][R语言]股票分析实战[8]:因子与subset的关系
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...
uniapp使用tcp和udp的区别和例子
在Node.js中,主要有三种socket:TCP,UDP和Unix域套接字。以下分别介绍这TCP/UDP的使用方法和示例: TCP socket TCP socket提供了可靠的、面向连接的通信流,适用于需要可靠传输的应用,例如Web浏览器的HTTP请…...
静态网页设计——个人图书馆(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)
前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1VN4y1q7cz/?vd_source5f425e0074a7f92921f53ab87712357b 源码:https://space.bilibili.co…...
APP出海需知——Admob广告变现竞价策略
越来越多的出海公司更加重视应用的广告变现,Admob因其提供丰富的广告资源,稳定的平台支持,被广泛采用接入。 Admob广告变现策略 1、bidding竞价策略 Bidding目前是Admob广泛推广的较成熟的变现方案,当竞价网络和瀑布流混合时&a…...
微服务实战系列之API加密
前言 随着一阵阵凛冽寒风的呼啸,新的年轮不知不觉滚滚而来。故事随着2023的远去,尘封于案底;希望迎着新年,绽放于枝头。在2024新岁启航,扬帆破浪之时,让烦恼抛洒于九霄,让生机蓬勃于朝朝暮暮。 …...
android apk文件的签名问题
android的APK文件实际上是一个jar文件。jar的意思是瓶、罐,那就意味着jar文件是一个用来存放android应用相关文件的容器。事实上,它也确实如此,它只是一个带或不带压缩的zip文件,当你把.apk后缀改成.zip后,就能对此进行…...
ATTCK视角下的信息收集:主机发现
目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...




















