C#.Net学习笔记——设计模式六大原则

news2024/11/17 17:47:02

***************基础介绍***************

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.coloradmin.cn/o/1368296.html

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

相关文章

【Java 设计模式】设计原则

文章目录 ✨单一职责原则(SRP)✨开放/封闭原则(OCP)✨里氏替换原则(LSP)✨依赖倒置原则(DIP)✨接口隔离原则(ISP)✨合成/聚合复用原则(CARP&#…

Golang-strconv库学习笔记

前言: strconv库是go官方提供的一个标准包,主要用于字符串相关的处理。通过参考官方文档、中文文档和其他工具,进行学习记录。学习重点是其中的内置方法。 本文分为Atoi,Format系列,Parse系列,Append系列,…

C++每日一练(14):对称矩阵的判定

题目描述 输入矩阵的行数&#xff0c;再依次输入矩阵的每行元素&#xff0c;判断该矩阵是否为对称矩阵&#xff0c;若矩阵对称输出“yes"&#xff0c;不对称输出”no“。 输入 第一行输入一个正整数N&#xff08;N<20&#xff09;&#xff0c;表示矩阵的行数&#xff0…

UV贴图和展开初学者指南

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 介绍 这正是本文的主题——UV贴图——登上舞台的时候。大多数 3D 建…

苹果在美国被禁售有望反转!

都说开门大吉,可2024年似乎对苹果公司并不友好,一会儿是Apple Watch系列在美国被禁售,一会儿又是分析师唱衰iPhone 16,总之各种风声杂糅,给人一种苹果正遭遇重大危机的感觉。 此前美国国际贸易委员会(ITC)下达了对苹果旗下部分智能手表的进口禁令,Apple Watch Series9和…

ssm基于Vue的戏剧推广网站论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统戏剧推广信息管理难度大&#xff0c;容错率低&#xff0c…

解锁前端新潜能:如何使用 Rust 锈化前端工具链

前言 近年来&#xff0c;Rust的受欢迎程度不断上升。首先&#xff0c;在操作系统领域&#xff0c;Rust 已成为 Linux 内核官方认可的开发语言之一&#xff0c;Windows 也宣布将使用 Rust 来重写内核&#xff0c;并重写部分驱动程序。此外&#xff0c;国内手机厂商 Vivo 也宣布…

【推文】企业级AI问答知识库训练营,火热开营中!

简介&#xff1a;阿里云人工智能平台PAI【企业AI成长营】系列课程上线&#xff01;第一弹&#xff1a;企业AI问答知识库训练营&#xff0c;手把手带你从入门到实操快速完成知识库搭建&#xff0c;助力企业AI应用落地。 &#x1f4da; 企业AI问答知识库训练营&#xff1a;点击报…

【习题】应用程序框架

判断题 1. 一个应用只能有一个UIAbility。错误(False) 正确(True)错误(False) 2. 创建的Empty Ability模板工程&#xff0c;初始会生成一个UIAbility文件。正确(True) 正确(True)错误(False) 3. 每调用一次router.pushUrl()方法&#xff0c;页面路由栈数量均会加1。错误(Fal…

综合智慧能源监测管理平台,实现能源管理“透明”化

能源问题是全球面临的最大问题&#xff0c;在提高经济增长的同时&#xff0c;也引发了能源供应危机及环境严重等问题&#xff0c;降低能源管理、低碳环保是我们未来发展的必经之路。 为了解决这一问题&#xff0c;智慧能源管理平台应运而生。平台采用微服务架构&#xff0c;整…

局域网IP地址冲突、环路的罪魁祸首是什么?

中午好&#xff0c;我的网工朋友。 这个时代&#xff0c;网络已经贯穿了人们的生活&#xff0c;对企业而言&#xff0c;办公信息化更是离不开网络支持。 为了提高安全管理和信息化水平&#xff0c;很多企业都建立了完善的办公信息系统&#xff0c;但一些企业在网络建设方面还…

代码随想录算法训练营第二十八天 | 93.复原IP地址、78.子集、90.子集II

93.复原IP地址 题目链接&#xff1a;93.复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1"…

网站如何创建百度地图显示地理位置

在做企业网站的时候&#xff0c;我们会放置一个地理位置&#xff0c;我们可以引用百度地图&#xff0c;来显示我们的店铺所在位置 效果演示&#xff1a; 操作步骤 1、打开百度地图https://map.baidu.com/&#xff0c;搜索输入地址 2、点击地址 3、会出现如下视图 4、点击分享…

typora导出html添加目录

typora导出html添加目录 使用方法 首先要从typora导出html文件&#xff0c;之后用记事本编辑器html文件 找到文档最后面&#xff0c;如图&#xff1a; 用文字编辑类工具打开sideBar.txt&#xff0c;复制其中所有内容【内容在下面】 在如上图的位置插入所复制的内容 打开修改…

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…

计算机体系结构动态调度(计分板及Tomasulo)学习记录

1.动态调度核心思想&#xff1a;允许就绪指令越过前方停顿指令&#xff0c;提前进入运行&#xff08;乱序执行&#xff09; 就绪指令指不存在资源冲突、操作数已就绪的指令&#xff0c;例如&#xff0c;计分板算法使用计分板来实现&#xff0c;Tomasulo使用保留站来实现&#…

白灯和黄灯哪个更保护视力?安利保护视力的护眼台灯

现代社会&#xff0c;人们的生活和工作都离不开电子产品&#xff0c;长时间面对电脑、手机等设备造成的眼睛疲劳和视力衰退的问题也愈发普遍。为此&#xff0c;护眼台灯应运而生&#xff0c;旨在为用户提供更加舒适、健康的光源&#xff0c;减少对眼睛的伤害&#xff0c;同时提…

pytorch09:可视化工具-TensorBoard,实现卷积核和特征图可视化

目录 一、TensorBoard简介二、TensorBoard安装三、TensorBoard运行可视化四、TensorBoard详细使用4.1 SummaryWriter4.2 add_scalar()4.3 add_scalars()4.4 add_histogram()4.4.1实际项目开发使用 4.5 add_image()4.6 torchvision.utils.make_grid4.7 卷积核和特征图可视化4.7.…

IntelliJ IDEA开发工具常规设置、插件、快捷键、Debug和集成工具一篇快速入门

文章目录 常规设置同步设置快捷键&#xff08;Windows&#xff09;搜索层级关系查看光标选择代码定位代码操作Git操作编辑器操作 Debug操作集成本地Git集成本地Maven集成本地Tomcat实用插件 版本说明&#xff1a; 注意&#xff1a;若和上面的IDEA版本差异较大&#xff0c;可能存…

第二证券:主力为什么要砸盘?

砸盘就是在股票的某个阶段有许多卖出单&#xff0c;这些许多的卖出单不断的成交使股票价格出现快速下跌。一般是受到主力资金洗盘或者出货所影响形成的。 1、洗盘 个股通过长时间上涨之后&#xff0c;盘中的散户较多&#xff0c;主力为了洗掉盘中的散户&#xff0c;在低位吸筹…