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

news2024/11/28 5:23:33

在这里插入图片描述

目录

  • 💫单一职责原则 (Single Responsibility Principle, SRP)
  • 💫开放-封闭原则 (Open-Closed Principle, OCP)
  • 💫依赖倒转原则 (Dependency Inversion Principle, DIP)
  • 💫里氏代换原则 (Liskov Substitution Principle, LSP)
  • 💫迪米特原则 (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.coloradmin.cn/o/2248837.html

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

相关文章

fatal error in include chain (rtthread.h):rtconfig.h file not found

项目搜索这个文件 rtconfig 找到后将其复制粘贴到 你的目录\Keil\ARM\ARMCC\include 应该还有cJSON,rtthread.h和 等也复制粘贴下

【回文数组——另类递推】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n / 2; i)b[i] a[i] - a[n1-i];ll ans 0;…

SQL基础入门—— 简单查询与条件筛选

在SQL中&#xff0c;查询是从数据库中获取数据的核心操作&#xff0c;而条件筛选是查询中不可或缺的一部分。通过使用条件筛选&#xff0c;我们可以精准地从大量数据中提取我们需要的信息。本节将详细讲解如何使用SQL进行简单查询与条件筛选&#xff0c;包含常见的条件运算符和…

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

英语知识网站:Spring Boot技术构建

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

TMS FNC UI Pack 5.4.0 for Delphi 12

TMS FNC UI Pack是适用于 Delphi 和 C Builder 的多功能 UI 控件的综合集合&#xff0c;提供跨 VCL、FMX、LCL 和 TMS WEB Core 等平台的强大功能。这个统一的组件集包括基本工具&#xff0c;如网格、规划器、树视图、功能区和丰富的编辑器&#xff0c;确保兼容性和简化的开发。…

【AIGC】国内AI工具复现GPTs效果详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;前言&#x1f4af;本文所要复现的GPTs介绍&#x1f4af;GPTs指令作为提示词在ChatGPT实现类似效果&#x1f4af;国内AI工具复现GPTs效果可能出现的问题解决方法解决后的效…

网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…

【es6】原生js在页面上画矩形及删除的实现方法

画一个矩形&#xff0c;可以选中高亮&#xff0c;删除自己效果的实现&#xff0c;后期会丰富下细节&#xff0c;拖动及拖动调整矩形大小 实现效果 代码实现 class Draw {constructor() {this.x 0this.y 0this.disX 0this.disY 0this.startX 0this.startY 0this.mouseDo…

12 —— Webpack中向前端注入环境变量

环境变量的作用&#xff1a;根据不同环境&#xff0c;执行不同的配置 需求&#xff1a;开发模式下打印语句生效&#xff0c;生产模式下打印语句失效 —— 使用Webpack内置的DefinePlugin插件 const webpack require(webpack) module.exports { plugins: [ new webpack.Def…

Learn Git Branching 学习笔记

网址&#xff1a;Learn Git Branching 一、基础篇 1.1 git commit 1.1.1 示例&#xff08;git commit&#xff09; git commit 1.1.2 题目&#xff08;两次提交记录&#xff09; git commit git commit 前 后 1.2 git branch 1.2.1 示例&#xff08;git branch <>、git …

Unity类银河战士恶魔城学习总结(P145 Save Skill Tree 保存技能树)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了技能树的保存 警告&#xff01;&#xff01;&#xff01; 如果有LoadData&#xff08;&#xff09;和SaveData(&#xff09;…

从 App Search 到 Elasticsearch — 挖掘搜索的未来

作者&#xff1a;来自 Elastic Nick Chow App Search 将在 9.0 版本中停用&#xff0c;但 Elasticsearch 拥有你构建强大的 AI 搜索体验所需的一切。以下是你需要了解的内容。 生成式人工智能的最新进展正在改变用户行为&#xff0c;激励开发人员创造更具活力、更直观、更引人入…

社团管理新工具:SpringBoot框架

3系统分析 3.1可行性分析 通过对本社团管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本社团管理系统采用SSM框架&#xff0c;JAVA作为开发语言&#…

Vue3 源码解析(三):静态提升

什么是静态提升 Vue3 尚未发布正式版本前&#xff0c;尤大在一次关于 Vue3 的分享中提及了静态提升&#xff0c;当时笔者就对这个亮点产生了好奇&#xff0c;所以在源码阅读时&#xff0c;静态提升也是笔者的一个重点阅读点。 那么什么是静态提升呢&#xff1f;当 Vue 的编译器…

8款Pytest插件助力Python自动化测试

当测试用例变得复杂&#xff0c;或者需要处理大量测试数据时&#xff0c;插件通过使测试更加简洁和结构化而变得非常有用。Python凭借其简洁性和多功能性&#xff0c;成为自动化测试的热门选择&#xff0c;而pytest是最广泛使用的测试框架之一。虽然pytest本身功能强大&#xf…

【spark-spring boot】学习笔记

目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…

Spring Boot 3 集成 Spring Security(2)授权

文章目录 授权配置 SecurityFilterChain基于注解的授权控制自定义权限决策 在《Spring Boot 3 集成 Spring Security&#xff08;1&#xff09;》中&#xff0c;我们简单实现了 Spring Security 的认证功能&#xff0c;通过实现用户身份验证来确保系统的安全性。Spring Securit…

Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)

目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划&#xff08;ERP&#xff09;系统。它提供了广泛的功能&#xff0c;包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性&#xff0c;允许用户根据业务需求…

【Android】ARouter的使用及源码解析

文章目录 简介介绍作用 原理关系 使用添加依赖和配置初始化SDK添加注解在目标界面跳转界面不带参跳转界面含参处理返回结果 源码基本流程getInstance()build()navigation()_navigation()Warehouse ARouter初始化init帮助类根帮助类组帮助类 completion 总结 简介 介绍 ARouter…