C# 设计模式的七大原则详解

文章目录

  • 前言
  • 1. 单一职责原则 (SRP)
  • 2. 开放封闭原则 (OCP)
  • 3. 里氏替换原则 (LSP)
  • 4. 依赖倒置原则 (DIP)
  • 5. 接口隔离原则 (ISP)
  • 6. 合成/聚合复用原则 (CARP)
  • 7. 迪米特法则 (LoD)


前言

在 C# 编程中,设计模式的七大原则是保证代码质量和可维护性的基石。这些原则不仅仅是理论上的指导,更是在实际项目开发中的重要实践。本文将详细解释每个原则,并附上相应的 C# 示例代码,帮助读者更好地理解和应用这些原则。


1. 单一职责原则 (SRP)

单一职责原则要求一个类应该只有一个引起变化的原因,即一个类只负责一项功能。这有助于保持类的简洁性和可维护性,降低代码的复杂度。

示例代码:

using System;// 不好的设计,一个类负责了两个不同的功能
class BadDesign
{public void ProcessData(){// 处理数据的逻辑}public void GenerateReport(){// 生成报告的逻辑}
}// 好的设计,将功能分开到不同的类中
class DataProcessor
{public void ProcessData(){// 处理数据的逻辑}
}class ReportGenerator
{public void GenerateReport(){// 生成报告的逻辑}
}

2. 开放封闭原则 (OCP)

开放封闭原则要求软件实体应该对扩展开放,对修改关闭。这意味着通过扩展已有的代码来实现新的功能,而不是修改已有的代码。

示例代码:

using System;// 不好的设计,需要修改原有类来添加新功能
class BadDesign
{public void ProcessData(){// 处理数据的逻辑}
}// 好的设计,通过扩展来添加新功能
interface IDataProcessor
{void ProcessData();
}class DataProcessor : IDataProcessor
{public void ProcessData(){// 处理数据的逻辑}
}class NewFeatureProcessor : IDataProcessor
{public void ProcessData(){// 新功能的处理逻辑}
}

3. 里氏替换原则 (LSP)

里氏替换原则要求子类型必须能够替换掉它们的父类型,确保子类可以完全替代父类,并且不会影响系统的正确性。

示例代码:

using System;// 不好的设计,子类修改了父类的行为
class BadDesign
{public virtual void ProcessData(){// 处理数据的逻辑}
}class Child : BadDesign
{public override void ProcessData(){// 修改了父类的行为}
}// 好的设计,子类不修改父类的行为
class GoodDesign
{public void ProcessData(){// 处理数据的逻辑}
}class Child : GoodDesign
{// 不需要重写父类的方法
}

4. 依赖倒置原则 (DIP)

依赖倒置原则要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象。这有助于降低模块之间的耦合度。

示例代码:

using System;// 不好的设计,高层模块直接依赖于低层模块
class BadDesign
{private LowLevelDependency dependency = new LowLevelDependency();
}class LowLevelDependency
{// 低层模块的功能实现
}// 好的设计,高层模块依赖于抽象
interface IDependency
{void DoSomething();
}class GoodDesign
{private IDependency dependency;public GoodDesign(IDependency dependency){this.dependency = dependency;}
}class LowLevelDependency : IDependency
{public void DoSomething(){// 功能实现}
}

5. 接口隔离原则 (ISP)

接口隔离原则要求客户端不应该被迫依赖于它们不使用的接口,避免接口过于庞大、臃肿。

示例代码:

using System;// 不好的设计,一个接口包含了多个不相关的方法
interface IBadInterface
{void Method1();void Method2();void Method3();
}// 好的设计,根据客户端的需求定义专门的接口
interface IGoodInterface1
{void Method1();
}interface IGoodInterface2
{void Method2();
}

6. 合成/聚合复用原则 (CARP)

合成/聚合复用原则要求尽量使用合成/聚合,而不是继承来实现代码复用,以避免继承带来的紧耦合和继承链的脆弱性。

示例代码:

using System;// 不好的设计,使用继承来复用代码
class BadDesign
{// 共享的逻辑
}class Child : BadDesign
{// 子类的特定逻辑
}// 好的设计,使用组合来复用代码
class GoodDesign
{private SharedLogic sharedLogic;public GoodDesign(SharedLogic sharedLogic){this.sharedLogic = sharedLogic;}
}

7. 迪米特法则 (LoD)

迪米特法则要求一个对象应该对其他对象有尽可能少的了解,避免类之间的直接通信,降低耦合度。

示例代码:

using System;// 不好的设计,类直接依赖于其他类
class BadDesign
{private Dependency dependency = new Dependency();public void DoSomething(){// 使用 dependency 的功能}
}// 好的设计,通过中介者来减少直接依赖
class GoodDesign
{private Mediator mediator;public GoodDesign(Mediator mediator){this.mediator = mediator;}public void DoSomething(){mediator.DoSomething();}
}class Mediator
{private Dependency dependency = new Dependency();public void DoSomething(){// 使用 dependency 的功能}
}

以上是 C# 设计模式的七大原则的详细解释和示例代码。通过遵循这些原则,我们可以编写出更加灵活、可维护和易扩展的代码,从而提高软件开发的效率和质量。

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

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

相关文章

2024 Mathorcup高校数学建模挑战赛(B题)| 甲骨文识别 | 建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,以CNN卷积神经网络,计算机视觉等强大工具,构建了解决复杂问题的独特方案。深度学习, 混沌模型的妙用,为降低非法野生动物贸易提供新视角。通过综合分析,描…

IP广播对讲系统停车场解决方案

IP广播对讲系统停车场解决方案 一、需求分析 随着国民经济和社会的发展, 选择坐车出行的民众越来越多。在保护交通安全的同时,也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战, 需要停车场系统提高工作效率与服…

mysql数据库基础--基础操作

加 油 1.数据库基础操作 1.1创建数据库 在对数据表中的数据进行任何操作之前,首先必须创建一个数据库。 基本语法结果: create database 新建数据库名;1.2查看数据库 在MySQL中查看数据库的基本语法: show create database 数据库; 1.…

01-Git 之快速入门操作本地仓库

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list1.1 为什么要使用版本控制? 从个人角度: 在做项目时,如果一点点去改代码会很乱,不利…

OpenCV4.9更多形态转换

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9处理平滑图像 下一篇:OpenCV4.9更多形态转换 基于这两者,我们可以对图像进行更复杂的转换。在这里,我们简要讨论 OpenCV 提供的 5 个操作: …

FreeBuf 全球网络安全产业投融资观察(3月)

综述 据不完全统计,2024年3月,全球网络安全市场共发生投融资事件53起,其中国内4起,国外49起。 3月全球络安全产业投融资统计表(数据来源:航行资本、36氪) 整体而言,国内4起投融资事…

EasyExcel中对图片大小及位置进行调整(自定义拦截器)

如何对我们导出的图片设置大小和位置 首先我们先丢入一张图片,这里我就直接通过URL的形式进行编写 定义一个存储图片的类 import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter;import java.net.URL;Getter Setter EqualsAndHashCode public class…

AI写作软件哪个好?这4款好评如潮

在信息时代,AI技术的发展的日新月异,AI写作软件也因此诞生。特别是人们对于高效、便捷的写作工具需求日益增长,AI写作软件作为一种新兴的工具,在帮助人们提升写作效率、拓展创作思路方面发挥着越来越重要的作用。这些AI写作软件为…

C语言 函数——代码风格

目录 基本的代码规范 程序版式 对齐(Alignment)与缩进(indent) 变量的对齐规则 空行——分隔程序段落的作用 代码行内的空格——增强单行清晰度 代码行 长行拆分 标识符命名规则 标识符命名的共性规则 windows应用程序…

PostgreSQL入门到实战-第十八弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(二)官网地址PostgreSQL概述PostgreSQL中表别名命令理论PostgreSQL中表别名命令实战更新计划 PostgreSQL中表连接操作(二) 了解PostgreSQL表别名及其实际应用程序。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…

19c数据库/dev/shm/过小导致pga内存不够

pga_aggregate_limit已经设置了120G,alert还是报内存不够 查询select * from v$pgastat,发现MGA占了80G内存 查看/dev/shm: 发现设置了7G,操作系统是512G,正常情况下/dev/shm应该是操作系统的一半,修改为250G后数据库…

微信小程序 django+nodejs电影院票务售票选座系统324kd

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 前端:HTML5,CSS3 VUE 后端:java(springbootssm)/python(flaskdja…

vue3:菜单、标签页和面包屑联动效果

文章目录 1.整体思路2.实现过程 概要 提示:这里可以添加技术概要 例如: openAI 的 GPT 大模型的发展历程。 1.整体思路 在之前做的后台项目中,菜单、标签页和面包屑之间的联动,自己都是通过在路由前置守卫中,定义b…

微服务面试题二

1.什么是雪崩 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。 如何解决雪崩? 超时处理:请求超时就返回错误信息,不会无休止等待仓壁模式:限定每个业务能使用的线程数&a…

WPS的JS宏如何批量实现文字的超链接

表格中需要对文字进行超链接,每个链接指引到不同的地址。例如: 实现如下表格中,文件名称超级链接到对应的文件路径上,点击对应的文件名称,即可打开对应的文件。 序号文件名称文件路径1变更申请与处理表.xls文档\系统…

$(obj)/%.bin: $(obj)/*

$(obj)/%.bin: $(obj)/*.bin 是一个Makefile规则,用于指定如何生成.bin文件。这里解释一下这个规则的各个部分: $(obj)/%.bin 是目标文件的模式。%代表任意长度的字符串,$(obj)是一个变量,通常用来表示对象文件的输出目录。例如&a…

第十三届蓝桥杯省赛大学B组编程题(c++)

D.刷题统计 二分(AC): 注意:二分时右边界 right 的确定 #include<iostream> using namespace std; long long a,b,n; bool check(long long x){long long tx/7;x%7;long long temp0;if(x<5) tempx*a;else temp5*a(x-5)*b;long long cntt*(5*a2*b)temp;return cnt&g…

MySOL之旅--------MySQL数据库基础( 2 )

本篇碎碎念:尽自己最大的努力,直到筋疲力尽为止,加油 今日份励志文案: 别人都在前进,我为什么要停下 目录 补上一条博客缺失的内容 常用数据类型 数值类型&#xff1a; 字符串类型&#xff1a; 日期/时间类型&#xff1a; 二进制类型&#xff1a; 其他类型&#xff1a; …

抖音小店入驻有什么条件?资金少,没经验的普通人做得起吗?

大家好&#xff0c;我是电商花花。 在直播电商的推动下&#xff0c;抖音小店独特的电商模式下吸引着众多的商家&#xff0c;吸引着一波又一波的创业者入驻&#xff0c;想要在抖音小店上开垦出属于自己的电商净土。 想要入驻抖音小店还需要一些条件&#xff0c;然后才能入驻成…

Python机器学习学习线路

随着人工智能技术的飞速发展&#xff0c;机器学习已经成为计算机科学领域的热门话题。Python&#xff0c;作为一门功能强大且易于上手的编程语言&#xff0c;成为学习机器学习的理想选择。本文将为您介绍一条Python机器学习的学习线路&#xff0c;帮助您逐步掌握机器学习的基础…