C#高级--设计模式(七个原则)

一、单一职责原则

原理:

单一职责原则即:对于一个类而言,应该仅有一个引起他变化的原因。换言之,一个类只负责一个功能领域中的相应职责。

单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,其难点和重点在于发现职责,并把这些职责相互分离,即区分职责的粒度问题

总而言之,就是一个类中,只负责一件事,只有一个引起变更的原因。

单一职责的好处是:

好处一:提高代码的可读性,提高系统的可维护性

好处二:降低类的复杂度,一个模块只负责一个职责,提高系统的可拓展性和可维护性。

好处三:降低变更引起的风险。变更是必然的。如果单一职责做的更好,当修改一个功能的时候可以显著降低对另一个功能的影响。

二、开放封闭原则

原理:

1、对扩展开放,对修改关闭。其目的即:提高代码可复用性和可维护性。 尽量少地去改动已有的模块,尤其是底层模块。

2、在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级,可以通过使用接口和抽象类达到这样的效果。

其精神所在即:面向需求,对程序的改动是通过添加新代码进行的而不是更改现有代码。 不更改抽象层而可修改系统实现层。

三、里氏替换原则

原理:

1、任何基类可以出现的地方,子类一定可以出现,即:子类型必须能够替换掉其父类型。

2、LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。

3、LSP是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范

四、依赖倒置原则

原理:

1.高层模块不应该依赖于低层模块,两者都应以来抽象;

2.抽象不应该依赖于细节,细节应该依赖与抽象。

 简单的说就是要求对抽象进行编程,不要对实现进行编程,这里的抽象即抽象类和接口。

依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,互不影响,

实现模块间的松耦合。 

关于依赖

 1、⼀一个优秀的⾯面向对象程序设计,核⼼心的原则之⼀一就是将变化「隔离」/「封装」,
使得变化部分发⽣生变化时,其他部分,不不受影响。
2、为了了实现这个⽬目的,需要使⽤用⾯面向接⼝口编程,使⽤用后,客户类,不不再直接依赖服务类,
⽽而是依赖⼀一个抽象的接⼝口,这样,客户类就不不能在内部直接实例例化服务类。
3、但是客户类在运⾏行行的过程中,⼜又需要具体的服务类来提供服务,因为接⼝口是不不能实例例化的,
就产⽣生了了⼀一个⽭矛盾:客户类不不允许实例例化服务类,但是客户类⼜又需要服务类的服务。
4、为了了解决这个⽭矛盾,我们设计了了⼀一种解决⽅方案,既:客户类定义⼀一个注⼊入点,⽤用于服务类的注⼊入,
⽽而客户类的客户类(Program类)负责根据情况,实例例化服务类,注⼊入到客户类中,从⽽而解决了了这个⽭矛盾。

依赖倒置代码案例如下所示:

namespace Program_依赖倒置原则
{internal class Program{static void Main(string[] args){//歌手歌唱不同国家的歌曲Singer singer = new Singer();singer.SingSongChinese(new ChinenseSong());singer.SingSongChinese(new JapaneseSong());Console.ReadKey();}}interface ISong{string SingSong();}class ChinenseSong:ISong{public string SingSong(){return "我在唱中文歌";}}class KoreaSong : ISong{public string SingSong(){return "韩国歌曲";}}class JapaneseSong : ISong{public string SingSong(){return "日本歌曲";}}class Singer{//调用者和被调用者之间是强耦合的关系//使用抽象封装变化//  通过抽象,使各个模块或者类的实现彼此独立,互不影响,实现模块间的松耦合public void SingSongChinese(ISong cs){Console.WriteLine("正在唱"+cs.SingSong());}}
}

 

五、接口隔离原则

原理:

1、客户端不应该依赖他不需要的接口。

2、一个类对另一个类的依赖应该建立在最小接口上

3、接口尽量细分不要一个接口中放多种方法。

它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

代码案例: 

namespace Program_接口分离原则
{internal class Program{static void Main(string[] args){}}interface IScore{//修改某个学生的成绩void ChangeScore();}//接口要符合高内聚//接口要符合单一职责原则//还要实现类权限的问题,对接口中的方法进行分类细分interface ISuperScore{void AddScore();//删除某个学生的成绩void DeleteScore();}interface IQueryScore{void QueryScore();}class Teacher:IScore,IQueryScore{public void AddScore() { }public void DeleteScore() { }public void QueryScore() { }public void ChangeScore(){}}class Student : IQueryScore{public void QueryScore(){throw new NotImplementedException();}}
}

六、迪米特原则

原理:

1、它要求一个对象对其他对象有最少的了解(最少知识原则)。

2、降低类之间的耦合、

3、迪米特法则实际上是一个类在创建方法和属性时要遵守的法则。

迪米特法则强调,在类的结构设计上,尽量降低成员的访问权限。

其根本思想即强调了类之间的松耦合。 一般来说,类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对关系类造成波及。

案例打印总公司员工和分公司员工信息: 

namespace Program_迪米特原则
{internal class Program{static void Main(string[] args){//总公司员工类:ID//总公司员工管理类//添加总公司员工//打印总公司每个员工//打印分公司每个员工//分公司员工类//分公司管理类HeadEmployeeManager headEmployeeManager = new HeadEmployeeManager();headEmployeeManager.PrintEmployee();Console.ReadKey();}class HeadEmployee{public int ID { get; set; }}class HeadEmployeeManager{//总公司员工集合private List<HeadEmployee> headEmployee = new List<HeadEmployee>();//添加总公司员工public List<HeadEmployee> AddHeadEmployees(){for(int i = 0; i < 10; i++){headEmployee.Add(new HeadEmployee {  ID = i+1 });}return headEmployee;}public void PrintEmployee(){this.AddHeadEmployees();//打印总公司员工Console.WriteLine("===========================以下是总公司员工的编号==========================");for (int i = 0;i<headEmployee.Count;i++){Console.WriteLine(headEmployee[i].ID);}Console.WriteLine("==========================以下是分公司员工的编号============================");//打印分公司员工//创建分公司员工管理类的对象BodyEmployeeManager bodyEmployeeManager = new BodyEmployeeManager();//调用AddBodyEmployee添加分公司成员,并获取返回值List<BodyEmployee> listBodyEmployees = bodyEmployeeManager.AddBodyEmployees();for(int i = 0; i < listBodyEmployees.Count;i++){Console.WriteLine(listBodyEmployees[i].ID);}}}//分公司class BodyEmployee{public int ID { get; set; }}class BodyEmployeeManager{private List<BodyEmployee> bodyEmployees = new List<BodyEmployee>();public List<BodyEmployee> AddBodyEmployees(){for(int i = 0; i < 5; i++){bodyEmployees.Add(new BodyEmployee {  ID = i+1 });}return bodyEmployees;}}}
}

七、合成复用原则

原理:

1.合成复用原则,又称为组合聚合复用原则。

2.尽量使用对象组合,而不是继承来达到复用。

3.合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

继承带来的问题: 

1.破坏了系统的封装性,基类发生了改变,子类的实现也会发生改变。

2.子类如果不需要Method3,则系统的耦合性变高。

3.继承使静态的不能在程序运行时发生改变。

合成复用具体情况实施代码: 

namespace Program_复合复用原则
{internal class Program{static void Main(string[] args){//继承问题://可能造成子类泛滥//可能会造成子类数量爆炸//打破了类的封装性//创建油车对象GasCar gascar = new GasCar(new RedColor());gascar.Move();Console.ReadKey();}}interface IColor{string GetColor();}class WhiteColor : IColor{public string GetColor(){return "我是白色的汽车";}}class BlackColor : IColor{public string GetColor(){return "我是黑色的汽车";}}class RedColor : IColor{public string GetColor(){return "我是红色的汽车";}}abstract class Car{public IColor color { get; set; }public Car(IColor Color)//组合,强拥有关系{this.color = Color;}public abstract void Move();}class GasCar : Car{public GasCar(IColor color) : base(color){}public override void Move(){Console.WriteLine(this.color.GetColor()+"的电动汽车");}}class ElectricCar : Car{public ElectricCar(IColor Color) : base(Color){}public override void Move() {Console.WriteLine(this.color.GetColor()+"的汽油汽车");}}
}

八、设计原则总结

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

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

相关文章

keepalived+HAProxy+MySQL双主实验

keepalivedHAProxyMySQL双主实验 环境准备 node1(HAProxy1):192.168.184.10 node2(HAProxy2):192.168.184.20 node3(MySQL1):192.168.184.30 node4(MySQL2):192.168.184.40 虚拟IP vip&#xff1a;192.168.184.100MySQL部署 在node3执行以下脚本&#xff1a; #!/bin/bash sy…

【Linux】部署单机项目(自动化启动)

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.部署项目 一.jdk安装 1.上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2.解压安装包 防止后面单个系列解压操作&#xff0c;我这边就直接将所有的要用的全部给解压&#xff0c;如下图注…

【数据集】世界水评估方案指标:灌溉面积/灌溉用水等

世界水评估方案指标 概述(Overview)数据下载(Data Download)案例1:F. Irrigated lands案例2:G. Irrigated water use参考World Water Development Report II-Indicators for World Water Assessment Programme 概述(Overview) 在关于全球环境变化和可持续发展的辩论…

(详细使用指南)Linux下交叉编译带ffmpeg的opencv并移植到RK3588等ARM端

一 问题背景 瑞芯微RK3588等嵌入式板作为边缘端设备为算法模型的部署提供了便利&#xff0c;目前很多分类或好检测模型针对边缘端做了优化或量化&#xff0c;使得在边缘端也能达到实时稳定的识别和检测效果。 但嵌入式设备普遍的flash emmc不大&#xff0c;一般在32G左…

Jitsi Meet 大型视频会议调优方案

jitsi meet 大型视频会议调优方案 在举办一些大型会议的时候,比如100个人会议,为了节约宽带和节省资源,我们并不会选择传输全部的音视频资源。 举个例子,比如100个人线下会议,如果大家都说话的情况下,大家要么听不清,要么听得是声音最大的那几个人。 视频会议也可以借…

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#x…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

【前端素材】推荐优质后台管理系统Jampack平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个&#xff0c;我的是Apple芯片&#xff0c;选Apple Silicon -- 第三步 右上角下载处打开安装包&…

Seata 入门知识

目录 概述 工作流程 工作模式 AT模式 TCC模式 概述 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 AT模式是阿里首推…

CUDA C++ 编程指南

目录 1. Introduction1.1. The Benefits of Using GPUs1.2. CUDA: A General-Purpose Parallel Computing1.3. A Scalable Programming Model CUDA C Programming Guide 1. Introduction 1.1. The Benefits of Using GPUs 在相似的价格和功耗范围内&#xff0c;图形处理单…

9个最受欢迎的开源自动化测试框架盘点!

自动化测试框架可以帮助测试人员评估多个Web和移动应用程序的功能&#xff0c;安全性&#xff0c;可用性和可访问性。尽管团队可以自己构建复杂的自动化测试框架&#xff0c;但是当他们可以使用现有的开源工具&#xff0c;库和测试框架获得相同甚至更好的结果时&#xff0c;通常…

Github开源贡献者的狂欢——教你如何免费领取价值$200的Starknet空投

前言&#xff1a; 2024 又迎来了四年一度的 BTC 减半时刻&#xff0c;币圈仿佛一下又热闹了起来&#xff0c;这几天有一个新的基于 ETH 的项目诞生了&#xff1a;StarkNet&#xff0c;代号 STRK&#xff0c;凡是在前 5000 个开源项目贡献过至少 3 个 commit 的程序猿都会被空投…

Linux系统网络服务部分拓展练习

1&#xff09;网关服务器&#xff1a;ens36&#xff1a;12.0.0.254/24&#xff0c;ens33&#xff1a;192.168.241.254/24&#xff1b;Server1&#xff1a;192.168.241.0/24&#xff1b;PC1和server2&#xff1a;自动获取IP&#xff1b;交换机无需配置。要求能够使用Xshell等远程…

MySQL - 事务日志

目录 1. redo日志 1.1 为什么需要REDO日志 1.2 REDO日志的好处、特点 1. 好处 2. 特点 1.3 redo的组成 1.4 redo的整体流程 1.5 redo log的刷盘策略 1.6 不同刷盘策略演示 1. 流程图 ​编辑2. 举例 1.7 写入redo log buffer 过程 1.8 redo log file 1. 相关参数…

matlab倒立摆小车LQR控制动画

1、内容简介 略 54-可以交流、咨询、答疑 2、内容说明 略 摆杆长度为 L&#xff0c;质量为 m 的单级倒立摆(摆杆的质心在杆的中心处)&#xff0c;小车的质量为 M。在水平方向施加控制力 u&#xff0c;相对参考系产生位移为 y。为了简化问题并且保其实质不变&#xff0c;忽…

【SelectIO】bitslice原语学习记录

基本概念 在Ultrascale (plus)系列上的FPGA中&#xff0c;Xilinx引入了bitslice硬核&#xff0c;它取代了7系列上的IDELAYCTRL/IODELAY/IOSERDES/IODDR系列硬核&#xff0c;用于为HP&#xff08;High Performance&#xff09;类型Bank上的IO接口提供串并转化、信号延时、三态控…

【k8s资源调度-HPA(自动扩缩容)】

1、HPA可以做什么&#xff1f; 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。通常用于Deployment&#xff0c;不适用于无法扩/缩容的对象&#xff0c;如DaemonSet。控制管理器每隔30s(可以通过-horizontal-pod-autoscaler–sync-period修改…

特征选择|一种提升预测模型性能的方法(原理及其优化实现,Matlab)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 如今&#xff0c;生成的数据集呈指数级增长&#xff0c;这将产生具有大量特征和样本的数据集&#xff0c;而显然&#xff0c;某些特征是不相关/冗余的&#xff0c;它们…

springBoot整合Redis(一、Jedis操作Redis)

在springboot环境下连接redis的方法有很多&#xff0c;首先最简单的就是直接通过jedis类来连接&#xff0c;jedis类就相当于是redis的客户端表示。 但是因为现在比较常用的是&#xff1a;StringRedisTemplate和RedisTemplate&#xff0c;所以jedis只做简单的介绍。 一、Jedis…