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

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

目录

  • :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.kler.cn/a/410130.html

相关文章:

  • 如何在 Eclipse 中调试ABAP程序
  • ubuntu中使用ffmpeg和nginx推流rtmp视频
  • 软件工程第14章小测
  • kafka是如何做到高效读写
  • 深入浅出:大数据架构中的流处理与实时分析
  • 【LLM训练系列02】如何找到一个大模型Lora的target_modules
  • flutter 专题十一 Fair原理篇Fair逻辑动态化架构设计与实现
  • 永磁同步电机末端振动抑制(输入整形)
  • 【Electron学习笔记(二)】基于Electron开发应用程序
  • 怎么规划一套电话机器人系统?
  • GitLab/GitHub 多环境配置SSH密钥
  • KADB支持arm架构Pro*c
  • 开源客户关系管理平台EspoCRM
  • 001 MATLAB介绍
  • 【Spring Cloud】 Gateway配置说明示例
  • GitHub 和 GitLab
  • SD-WAN在构建混合云架构中的作用
  • shell练习
  • 【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)
  • 1. Klipper从安装到运行
  • 单片机结合OpenCV
  • 发布订阅模式(TS)
  • [less] Operation on an invalid type
  • 数据治理:在企业数据管理中的关键角色与实现路径——《DAMA 数据管理知识体系指南》读书笔记- 第 3 章
  • 从入门到精通:解析如何使用亚马逊云服务器(AWS EC2)
  • 证明面积不超过1/8的一组凸形状可以平移填充进面积为1的凸形状内而不重叠