当前位置: 首页 > news >正文

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

目录

  • :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.mrgr.cn/news/78101.html

相关文章:

  • 【JavaScript】JavaScript开篇基础(7)
  • 探索Python的HTTP之旅:揭秘Requests库的神秘面纱
  • 性能工程的定义及体系建设的重要意义
  • java 可以跨平台的原因是什么?
  • 如何选择服务器
  • 图形化界面MySQL(MySQL)(超级详细)
  • 架构-微服务-环境搭建
  • uniapp+vue2重新进入小程序就清除缓存,设备需要重新扫码
  • 从Full-Text Search全文检索到RAG检索增强
  • jquery-picture-cut 任意文件上传(CVE-2018-9208)
  • python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
  • C++ static关键字
  • 利用processR软件包实现简单的中介效应模型
  • 【分治】--- 快速选择算法
  • 解决数据传送问题:内网http传输
  • 多模态大型语言模型(MLLM)综述
  • 【R安装】R语言的详细安装及环境配置(2024年11月)
  • Wordcloud也能生成一个,带html的词云图文件吗??
  • Flink中普通API的使用
  • 一篇文章了解Linux
  • 临床检验项目指标学习笔记
  • 【JUC-Interrupt】中断相关概念
  • 低代码开发平台搭建思考与实战
  • 嵌入式入门Day17
  • 【数据结构】链表的基本操作
  • Tkinter置顶弹窗提示操作成功