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、原则的原则,五大原则是手段,开闭原则是目标

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode】力扣热门之回文链表【简单难度】

题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 用例 输入:head [1,2,2,1] 输出:true 输入:head [1,2] 输出:f…

TikTok电商年度洞察:出海到底“卖什么”?各国多类目爆款洞察,迅速掌握市场领先优势

很多卖家在尝试出海时,常面临两大核心痛点:一是“卖什么”,即选择何种商品进行销售;二是“怎么卖”,即如何通过有效的营销策略将商品销售出去。TikTok主打的内容电商模式,通过短视频和直播等形式&#xff0…

LeetCode-1822/1502/896/13

1.数组元素积的符号(1822) 题目描述: 已知函数 signFunc(x) 将会根据 x 的正负返回特定值: 如果 x 是正数,返回 1 。 如果 x 是负数,返回 -1 。 如果 x 是等于 0 ,返回 0 。 给你一个整数数组…

2.SPSS数据文件的建立和管理

文章目录 数据文件的特点建立SPSS数据文件步骤 数据文件的结构变量的规则 数据的录入和保存录入数据保存文件 数据的编辑数据定位 数据文件的特点 SPSS数据库文件包括文件结构和数据两部分 SPSS数据文件中的一列数据称为一个变量。每个变量都应有一个名称,即&…

如何搭建WampServer并结合cpolar内网穿透实现公网访问本地服务

文章目录 推荐前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&am…

视图与索引连表查询内/外联和子查询

1.视图 先介绍一下视图: 从SQL的角度来看,视图和表是相同的,两者的区别在于表中存储的是实际的数据,而视图中保存的是SELECT语句(视图本身并不存储数据)。 使用视图可以轻松完成跨多表查询数据等复杂操作…

案例分享:当前高端低延迟视频类产品方案分享(内窥镜、记录仪、车载记录仪、车载环拼、车载后视镜等产品)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/135439369 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

Qt QWidget窗口基类

文章目录 1 QWidget介绍2 如何显示 QWidget窗口2.1 新建基于QWidget的窗口类2.2 再添加一个QWidget窗口类2.3 显示新添加的 QWidget窗口 3 常用的属性和方法3.1 窗口位置3.2 窗口大小3.3 窗口标题3.4 窗口图标3.5 资源文件 4 实例 1 QWidget介绍 Qt 中的常用控件,比…

flex弹性盒子常用的布局属性详解

想必大家在开发中经常会用到flex布局。而且还会经常用到 justify-content 属性实现分栏等等 接下来给大家分别讲一下 justify-content 的属性值。 以下是我敲的效果图大家可以清晰看出区别 space-between 属性值可以就是说两端对齐 space-evenly 属性值是每个盒子之间的…

觉得伺服方案比较难开发的可以看过来

参数 TMCM-1690是单轴FOC伺服电机控制模块集成预驱适合三相BLDC/PMSM和DC有刷伺服电机,带有高达1.5A栅极驱动电流和60V(48 V nominal)供电提供了UART(RS232-/RS485ready),CAN 和 EtherCAT 通讯接口支持TML,CANopen,或 CANopen-over-EtherCAT通讯协议TMCM-1690 支持增…

[足式机器人]Part2 Dr. CAN学习笔记 - Ch03 傅里叶级数与变换

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch03 傅里叶级数与变换 1. 三角函数的正交性2. 周期为 2 π 2\pi 2π的函数展开为傅里叶级数3. 周期为 2 L 2L 2L的函数展开4. 傅里叶级数的复数形式5. 从傅里叶级数推导傅里叶变换FT6. 总结 1. …

【控制篇 / 策略】(7.4) ❀ 01. IP地理位置数据库和地理地址对象 ❀ FortiGate 防火墙

【简介】在很多使用环境下,我们需要对指定国家的IP地址进行允许或禁止访问操作,例如只允许访问国内IP。以前只能手动添加IP地址对象到地址组,繁杂且效率低下,Fortinet提供了基于地理位置的IP库,就可以解决这个问题。 I…

手把手教你学会接口自动化系列一-浅浅地尝试编写登录接口的自动化代码

老痞既然要带你学会接口自动化,那么老痞肯定是要把你当做0基础,从最基本的开始写起,一步步写到最后。 我最先打开项目。 第一步就是需要登录,所以这个时候,我们查看下登录的接口,我抓到接口如下: 第一个就是登录的接口,接口的地址为: http://192.168.0.134:8081/log…

【PostgreSQL创建索引的锁分析和使用注意】

1.1 创建普通B-tree索引的整体流程 如下是梳理的创建普通B-tree索引的大概流程,可供参考。 1.校验新索引的Catalog元数据|语法解析 ---将创建索引的sql解析成IndexStmt结构|校验B-Tree的handler -----校验内核是否支持该类型的索引,在pg_am中查找&q…

2024年游泳耳机十大品牌排行榜,游泳耳机哪个牌子好

游泳耳机市场正呈现蓬勃发展的趋势,而在众多品牌中选择一款适合自己的游泳耳机变得愈发重要。游泳不仅是锻炼身体的有效方式,还是缓解压力的良好途径。然而,游泳时的单调可能成为一些人的困扰,特别是那些希望在运动中欣赏音乐或聆…

二叉树的层序遍历经典问题(算法村第六关白银挑战)

基本的层序遍历与变换 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣(LeetCode) 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入…

25 心形按钮

效果演示 实现了一个心形的心形图案&#xff0c;当用户点击图案时&#xff0c;图案会旋转并缩小&#xff0c;同时背景颜色会变成白色。 Code <div class"love"><input id"switch" type"checkbox"><label class"love-heart&…

*5.1 Global Memory Bandwidth

并行程序的执行速度可能因计算硬件的资源限制而有很大差异。虽然管理并行代码和硬件资源约束之间的交互对于在几乎所有并行编程模型中实现高性能很重要&#xff0c;但这是一种实用技能&#xff0c;最好通过为高性能设计的并行编程模型中的实践练习来学习。在本章中&#xff0c;…

xss-labs(1-5)

环境准备: 靶场下载:下载仓库 zhangmanhui/xss-labs - Gitee.com 启动phpStudy 搭建将文件解压拉到phpStudy的www目录下就行 最后直接访问:127.0.0.1/xss-labs-master/ 最后再准备一个浏览器的插件用来发送请求:HackBar 插件都配置好了,直接加载到你的浏览器的扩展…

以unity技术开发视角对android权限的讲解

目录 前言 Android权限分类 普通权限 普通权限定义 普通权限有哪些 危险权限 危险权限的定义 危险权限有哪些 动态申请权限实例 申请单个权限实例 第一步&#xff1a;在清单文件中声明权限 第二步&#xff1a;在代码中进行动态申请权限 申请多个权限实例 第一步&am…