C#入门理解设计模式的6大原则

**设计模式的原则是指导设计模式创建和应用的基本原则,这些原则有助于创建灵活、可维护且可扩展的软件系统。**

1. 单一职责原则(Single Responsibility Principle, SRP)

单一职责原则指出一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一项职责。

// 违反SRP的例子:一个类负责两个职责
public class Employee {public string Name { get; set; }public void SaveEmployeeDetails() {// 保存员工详细信息的代码}public void SendEmail(string message) {// 发送电子邮件的代码}
}// 遵循SRP的例子:将职责分离成不同的类
public class Employee {public string Name { get; set; }
}public class EmailService {public void SendEmail(string message) {// 发送电子邮件的代码}
}

2. 开放封闭原则(Open/Closed Principle, OCP)

开放封闭原则表明软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。

// 违反OCP的例子:通过修改现有类来添加新功能
public class ReportGenerator {public string GenerateReport() {// 报告生成的代码return "Report generated";}public string GenerateDetailedReport() {// 修改现有代码以生成详细报告return "Detailed report generated";}
}// 遵循OCP的例子:通过扩展来添加新功能
public class ReportGenerator {public string GenerateReport() {// 报告生成的代码return "Report generated";}
}public class DetailedReportGenerator : ReportGenerator {public override string GenerateReport() {// 新的详细报告生成代码return "Detailed report generated";}
}

3. 里氏替换原则(Liskov Substitution Principle, LSP)

里氏替换原则指出,子类型必须能够替换它们的基类型。这意味着在软件系统中,一个基类的对象可以被其子类的对象替换,而不影响系统的正确性。

// 里氏替换原则示例
public abstract class Shape
{public abstract double GetArea();
}public class Circle : Shape
{private double _radius;public Circle(double radius) => _radius = radius;public override double GetArea() => Math.PI * _radius * _radius;
}public class Rectangle : Shape
{private double _width, _height;public Rectangle(double width, double height) => (_width, _height) = (width, height);public override double GetArea() => _width * _height;
}// 可以在任何需要Shape的地方安全地使用Circle或Rectangle

4. 接口隔离原则(Interface Segregation Principle, ISP)

接口隔离原则强调应该避免创建过于庞大的接口。相反,应该创建多个专门的接口,每个接口只包含特定的功能。

// 违反ISP的例子:一个庞大的接口,要求实现所有方法
public interface IShape {void Draw();void Resize();void Move();// 其他与形状无关的方法...
}// 遵循ISP的例子:分离成多个专门的接口
public interface IDrawable {void Draw();
}public interface IResizable {void Resize();
}public class Circle : IDrawable, IResizable {public void Draw() {// 画圆的代码}void IResizable.Resize() {// 调整大小的代码}
}

5. 依赖倒置原则(Dependency Inversion Principle, DIP)

依赖倒置原则指出高层模块不应该依赖于低层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

// 违反DIP的例子:高层模块依赖于低层模块
public class EmailService {private SMTPClient smtpClient = new SMTPClient();public void SendEmail(string message) {smtpClient.Send(message);}
}// 遵循DIP的例子:依赖于抽象
public interface IEmailClient {void Send(string message);
}public class EmailService {private IEmailClient emailClient;public EmailService(IEmailClient emailClient) {this.emailClient = emailClient;}public void SendEmail(string message) {emailClient.Send(message);}
}public class SMTPClient : IEmailClient {public void Send(string message) {// 使用SMTP发送电子邮件的代码}
}

6. 组合/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)

这个原则与DIP紧密相关,它建议优先使用对象的组合/聚合来达到复用的目的,而不是通过继承。

// 违反CARPR的例子:通过继承来复用
public class Vehicle {public void Move() {// 移动交通工具的代码}
}public class Car : Vehicle {// 继承Vehicle,但Car可能有特殊的行为public override void Move() {// 汽车移动的代码}
}// 遵循CARPR的例子:使用组合来复用
public class Vehicle {public virtual void Move() {// 移动交通工具的代码}
}public class Car {private Engine engine;private Wheel[] wheels;public Car(Engine engine, Wheel[] wheels) {this.engine = engine;this.wheels = wheels;}public void Move() {engine.Start();foreach (var wheel in wheels) {wheel.Roll();}}
}public class Engine {public void Start() {// 发动机启动的代码}
}public class Wheel {public void Roll() {// 轮子滚动的代码}
}

编写代码时,需要灵活遵循这些原则,通过这些设计模式创建出更加灵活、可维护和可扩展的软件系统。在C#中实现这些原则,可以帮助我们更好地设计和构建应用程序。

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

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

相关文章

Project Euler_Problem 172_Few Repeated Digits_动态规划

原题目: 题目大意:18位数里头,有多少个数,对于每个数字0-9,在这18位里面出现均不超过3次 111222333444555666 布星~~ 112233445566778899 可以~~ 解题思路: 动态规划 代码: ll F[19][3000000];void …

Spring AOP IOC

spring的优缺点 IOC集中管理对象,对象之间解耦,方便维护对象AOP在不修改原代码的情况下,实现一些拦截提供众多辅助类,方便开发方便集成各种优秀框架 紧耦合和松耦合 松耦合可以使用单一职责原则、接口分离原则、依赖倒置原则 …

融资融券交易与普通的股票交易相比,有哪些优势和劣势?

融资融券交易与普通交易相比有着很大的不同: 1、资金要求不同。 投资者在进行普通证券交易时,必须有足额的资金才能买入证券,必须有足额的证券才能卖出。 而投资者进行融资融券交易,不需要持有足额的资金。当投资者预测证券的价格将要上涨&…

DedeCMS 未授权远程命令执行漏洞分析

dedecms介绍 DedeCMS是国内专业的PHP网站内容管理系统-织梦内容管理系统,采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板、网站升级转移均提供很大的便利,健壮的模板标签为站长DIY自己的网站提供了强有力…

无线通信:多址(Multiple Access)方式

什么是多址方式 多址方式又叫多址接入方式或多址技术,是指在一个网络(如移动通信的小区、无线局域网)中,当多个用户接入网络时,解决如何高效地共享一个无线资源(时间/频率/空间/载波)的技术。 …

springboot发送邮件

很久之前就想写一个总结的&#xff0c;一直没写&#xff0c;今天刚好又碰见了发送邮箱验证码的需求&#xff0c;刚好记录一波 一.核心依赖如下&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…

docker部署opensearch —— 筑梦之路

OpenSearch 简介 •OpenSearch 是一款开源的分布式搜索引擎(从 ElasticSearch 特定版本分叉而来)&#xff0c;可以执行快速、可扩展的全文搜索、应用程序和基础设施监控、安全和事件信息管理、运营健康跟踪等用例。 •OpenSearch 具有多种功能和插件&#xff0c;可以帮助索引、…

谷歌推出适用于安卓设备的“Find My Device”网络,功能类似苹果Find My

谷歌今日推出了适用于安卓设备的“Find My Device”网络&#xff0c;其功能类似于苹果的“Find My”网络&#xff0c;旨在帮助用户定位丢失、被盗的安卓产品。 安卓的“Find My Device”网络可以利用数以亿计运行 Android 9 或更高版本的安卓设备&#xff0c;通过蓝牙信号追踪丢…

自动化运维(二十五)Ansible 实战过滤器插件和缓存插件

Ansible 支持多种类型的插件&#xff0c;这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习 过滤器插件和缓存插件。 一、 过滤器插件&#xff08;Filter Plugins&#xff09; Ansible 过滤器插件&#xff08;Filter …

批量记录收支明细,高效记录当天的收支明细并查看每个支出占比,轻松掌握开销

在繁忙的现代生活中&#xff0c;我们时常因为琐碎的财务事务而分心。为了帮助您更好地管理财务&#xff0c;我们推出了这款智能财务助手&#xff0c;让您可以高效记录每天的收支明细&#xff0c;并轻松掌握每个支出的占比。从此告别混乱&#xff0c;让财务管理变得简单明了 第…

gym界面修改

资料&#xff1a;https://blog.csdn.net/weixin_46178278/article/details/135962782 在gym环境中使用mujoco的时候&#xff0c;有一个很难受的地方&#xff0c;界面上没有实时显示动作空间和状态空间状态的地方。 gym自己原始带的环境是用pygame画的图&#xff0c;所以在定义…

【前端】es-drager 图片同比缩放 缩放比 只修改宽 只修改高

【前端】es-drager 图片同比缩放 缩放比 ES Drager 拖拽组件 (vangleer.github.io) 核心代码 //初始宽 let width ref(108)//初始高 let height ref(72)//以下两个变量 用来区分是单独的修改宽 还是高 或者是同比 //缩放开始时的宽 let oldWidth 0 //缩放开始时的高 let o…

JWT重放漏洞如何攻防?你的系统安全吗?

大家好&#xff0c;我是石头~ 在数字化浪潮席卷全球的今天&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为身份验证的利器&#xff0c;已成为众多Web应用的首选方案。 然而&#xff0c;正如硬币有两面&#xff0c;JWT的强大功能背后也隐藏着潜在的安全风险&#xf…

2024mathorcup数学建模D题思路分析-量子计算在矿山设备配置及运营中的建模应用

# 1 赛题 D 题 量子计算在矿山设备配置及运营中的建模应用 随着智能技术的发展&#xff0c;智慧矿山的概念越来越受到重视。越来越多的 设备供应商正在向智慧矿山整体解决方案供应商转型&#xff0c;是否具备提供整体 解决方案的能力&#xff0c;也逐步成为众多矿山设备企业的核…

UVC摄像头在虚拟机Ubuntu16.04使用的正确姿势

前言&#xff1a;在Windows使用UVC摄像头是正常的&#xff0c;但在虚拟机Ubuntu中使用可以识别到&#xff0c; 但是一直没有数据出来&#xff0c;一度怀疑是摄像头不行&#xff0c;后来经过仔细研究&#xff0c;才发现是虚拟机usb设置有点问题。一、虚拟机USB设置USB 3.0,不然没…

【C++类和对象】上篇

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

数据仓库—ETL工具与技术:数据仓库的坚实基石

作为一名长期从事数据仓库领域的专业人士&#xff0c;我深知ETL&#xff08;Extract, Transform, Load&#xff09;工具和技术在构建和维护数据仓库中的核心作用。ETL不仅是数据流动的桥梁&#xff0c;更是确保数据质量和支持业务智能决策的关键环节。在这篇文章中&#xff0c;…

字节码文件的组成

字节码文件的组成 字节码文件的组成1 以正确的姿势打开文件2 字节码文件的组成2.1 基本信息2.2 常量池2.3 字段2.4 方法2.5 属性 3 字节码常用工具3.1 javap3.2 jclasslib插件3.3 Arthas 4 字节码常见指令 字节码文件的组成 1 以正确的姿势打开文件 字节码文件中保存了源代码…

Git 解决分支冲突

一、前言 一直习惯于 add commit push 的三步走&#xff0c;偶然间看到了一个评论说在 push 之前还有一个 pull&#xff0c;小小的疑问就埋在了我的心里。于是我就先了解了 pull 的工作原理&#xff0c;就是先拉取代码&#xff08;fetch&#xff09;再合并分支&#xff08;mer…

matlab使用教程(42)—常见的二维图像绘制方法

这个博客用于演示如何在 MATLAB 中创建曲线图、条形图、阶梯图、误差条形图、极坐标图、针状图、散点图。 1.曲线图 plot 函数用来创建 x 和 y 值的简单线图。 x 0:0.05:5; y sin(x.^2); figure plot(x,y) 运行结果&#xff1a; 线图可显示多组 x 和 y 数据。 x 0:0.05:…