系统设计时应时刻考虑设计模式基础原则

目录

  • :star2:单一职责原则 (Single Responsibility Principle, SRP)
  • :star2:开放-封闭原则 (Open-Closed Principle, OCP)
  • :star2:依赖倒转原则 (Dependency Inversion Principle, DIP)
  • :star2:里氏代换原则 (Liskov Substitution Principle, LSP)
  • :star2:迪米特原则 (Law of Demeter, LoD)

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

定义:一个类应该只有一个引起变化的原因。
含义:每个类只负责完成一种功能。如果一个类承担了多种职责,则这些职责之间可能会互相影响,导致代码难以维护。
优点
降低类的复杂性。
提高代码的可读性和可维护性。
更容易进行单元测试。
示例

// 违反单一职责原则
public class ReportManager {public void GenerateReport() { /* 生成报表逻辑 */ }public void PrintReport() { /* 打印报表逻辑 */ }
}// 符合单一职责原则
public class ReportGenerator {public void GenerateReport() { /* 生成报表逻辑 */ }
}
public class ReportPrinter {public void PrintReport() { /* 打印报表逻辑 */ }
}

🌟开放-封闭原则 (Open-Closed Principle, OCP)

定义:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
含义:在不修改原有代码的情况下,通过扩展功能满足新的需求。
优点
减少因为修改代码引发的错误。
提升代码的灵活性和可扩展性。
示例

// 违反开放-封闭原则
public class PaymentProcessor {public void ProcessPayment(string paymentType) {if (paymentType == "CreditCard") { /* 信用卡支付逻辑 */ }else if (paymentType == "PayPal") { /* PayPal 支付逻辑 */ }}
}// 符合开放-封闭原则
public interface IPayment {void Process();
}
public class CreditCardPayment : IPayment {public void Process() { /* 信用卡支付逻辑 */ }
}
public class PayPalPayment : IPayment {public void Process() { /* PayPal 支付逻辑 */ }
}
public class PaymentProcessor {public void ProcessPayment(IPayment payment) {payment.Process();}
}

🌟依赖倒转原则 (Dependency Inversion Principle, DIP)

定义:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
含义:通过依赖接口或抽象类,减少模块之间的耦合。
优点
提高代码的灵活性和可测试性。
减少模块之间的依赖。
示例

// 违反依赖倒转原则
public class Keyboard {public void Type() { /* 输入逻辑 */ }
}
public class Computer {private Keyboard _keyboard = new Keyboard();
}// 符合依赖倒转原则
public interface IInputDevice {void Type();
}
public class Keyboard : IInputDevice {public void Type() { /* 输入逻辑 */ }
}
public class Computer {private IInputDevice _inputDevice;public Computer(IInputDevice inputDevice) {_inputDevice = inputDevice;}
}

🌟里氏代换原则 (Liskov Substitution Principle, LSP)

定义:子类应该能够替换基类,并且在应用中表现一致。
含义:确保子类不会破坏基类的功能。在实现继承时,子类必须能够正确替代父类。
优点
保证系统的行为一致性。
避免因继承引入错误。
示例

// 违反里氏代换原则
public class Rectangle {public virtual void SetWidth(int width) { }public virtual void SetHeight(int height) { }
}
public class Square : Rectangle {public override void SetWidth(int width) { /* 改变行为,导致宽高不一致 */ }
}// 符合里氏代换原则
public abstract class Shape {public abstract int Area();
}
public class Rectangle : Shape {public int Width { get; set; }public int Height { get; set; }public override int Area() => Width * Height;
}
public class Square : Shape {public int Side { get; set; }public override int Area() => Side * Side;
}

🌟迪米特原则 (Law of Demeter, LoD)

定义:一个对象应该对其他对象有最少的了解。
含义:尽量减少类之间的直接耦合,通过中间类或方法传递信息。
优点
降低对象之间的耦合性。
提高代码的模块化。
示例

// 违反迪米特原则
public class Engine {public void Start() { }
}
public class Car {public Engine Engine { get; set; }
}
public class Driver {public void Drive(Car car) {car.Engine.Start(); // Driver 直接访问 Engine}
}// 符合迪米特原则
public class Engine {public void Start() { }
}
public class Car {private Engine _engine = new Engine();public void StartEngine() {_engine.Start();}
}
public class Driver {public void Drive(Car car) {car.StartEngine(); // Driver 通过 Car 访问 Engine}
}

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

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

相关文章

Spring 中的 ProxyFactory 创建代理对象

一、jdk 动态代理 和 cglib动态代理 简单介绍 1.jdk动态代理 public interface AService {public String serviceA(String param);public String serviceAA(String param); } public interface BService {public String serviceB(String param);public String serviceBB(Str…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

【深度学习】【RKNN】【C++】模型转化、环境搭建以及模型部署的详细教程

【深度学习】【RKNN】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【RKNN】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转rknnpytorch转onnxonnx转rkn…

Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程

clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类:编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如:计算机键盘。靠软件编程识别的称为非编码键盘;在单片机组成…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的,最近优化下无线网络,说新的设备用华为的,然后我是直到要部署的当天才知道用华为设备的,就很无语了,一点准备没有,以下为这次的实际操作记录吧&…

浅谈网络 | 传输层之TCP协议

目录 TCP 包头格式TCP 的三次握手TCP 的四次挥手TCP 的可靠性与"靠谱"的哲学TCP流量控制TCP拥塞控制 上一章我们提到,UDP 就像我们小时候一样简单天真,它相信“网之初,性本善,不丢包,不乱序”,因…

MongoDB相关问题

视频教程 【GeekHour】20分钟掌握MongoDB Complete MongoDB Tutorial by Net Ninja MongoDB开机后调用缓慢的原因及解决方法 问题分析: MongoDB开机后调用缓慢,通常是由于以下原因导致: 索引重建: MongoDB在启动时会重建索引…

嵌入式驱动开发详解3(pinctrl和gpio子系统)

文章目录 前言pinctrl子系统pin引脚配置pinctrl驱动详解 gpio子系统gpio属性配置gpio子系统驱动gpio子系统API函数与gpio子系统相关的of函数 pinctrl和gpio子系统的使用设备树配置驱动层部分用户层部分 前言 如果不用pinctrl和gpio子系统的话,我们开发驱动时需要先…

[模版总结] - 树的基本算法4 -最近公共祖先 LCA

什么是最近公共祖先LCA LCA:在一个树中,距离两个节点p,q最近可以是其本身并且同时包含这两个子节点的节点 题目连接 Leetcode 236 - LCA Leetcode 1644 - LCA II Leetcode 1650 - LCAIII Leetcode 1123 - LCA of Deepest leaves 基本思路 Leetcode 23…

永磁同步电机末端振动抑制(输入整形)

文章目录 1、前言2、双惯量系统3、输入整形3.1 ZV整形器3.2 ZVD整形器3.3 EI整形器 4、伺服系统位置环控制模型5、仿真5.1 快速性分析5.2 鲁棒性分析 参考 1、前言 什么是振动抑制?对于一个需要精确定位的系统,比如机械臂、塔吊、码头集装箱等&#xff…

jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js

参考资料: jQuery-Word-Export导出word_jquery.wordexport.js下载-CSDN博客 近期又需要自己做个 Html2Doc 的解决方案,因为客户又不想要 Html2pdf 的下载了,当初还给我费尽心思解决Html转pdf时中文输出的问题(html转pdf文件下载之…

【Redis_Day6】Hash类型

【Redis_Day6】Hash类型 Hash类型操作hash的命令hset:设置hash中指定的字段(field)的值(value)hsetnx:想hash中添加字段并设置值hget:获取hash中指定字段的值hexists:判断hash中是否…

【CSP CCF记录】201809-2第14次认证 买菜

题目 样例输入 4 1 3 5 6 9 13 14 15 2 4 5 7 10 11 13 14 样例输出 3 思路 易错点:仅考虑所给样例,会误以为H和W两人的装车时间是一一对应的,那么提交结果的运行错误就会让你瞬间清醒。 本题关键是认识到H和W的装车时间不一定一一对应&…

Unity清除所有的PlayerPrefs

方法1: 直接在你的代码中加入这句 PlayerPrefs.DeleteAll(); 方法2: 点击编辑窗口的这里

非交换几何与黎曼ζ函数:数学中的一场革命性对话

非交换几何与黎曼ζ函数:数学中的一场革命性对话 非交换几何(Noncommutative Geometry, NCG)是数学的一个分支领域,它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数,其中乘积不是交换性的&…

微信小程序下拉刷新与上拉触底的全面教程

微信小程序下拉刷新与上拉触底的全面教程 引言 在微信小程序的开发中,用户体验至关重要。下拉刷新和上拉触底是提高用户交互体验的重要功能,能够让用户轻松获取最新数据和内容。本文将详细介绍这两个功能的实现方式,结合实际案例、代码示例和图片展示,帮助开发者轻松掌握…

数据库的联合查询

数据库的联合查询 简介为什么要使⽤联合查询多表联合查询时MYSQL内部是如何进⾏计算的构造练习案例数据案例:⼀个完整的联合查询的过程 内连接语法⽰例 外连接语法 ⽰例⾃连接应⽤场景示例表连接练习 ⼦查询语法单⾏⼦查询多⾏⼦查询多列⼦查询在from⼦句中使⽤⼦查…

论文阅读:A fast, scalable and versatile tool for analysis of single-cell omics data

Zhang, K., Zemke, N.R., Armand, E.J. et al. A fast, scalable and versatile tool for analysis of single-cell omics data. Nat Methods 21, 217–227 (2024). 论文地址:https://doi.org/10.1038/s41592-023-02139-9 代码地址:https://github.com…

Hive离线数仓结构分析

Hive离线数仓结构 首先,在数据源部分,包括源业务库、用户日志、爬虫数据和系统日志,这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…