【温故】设计原则:依赖倒置原则

温故而知新 再看设计模式 定义:Define an object that encapsulates how a set of objects interact.Mediator。定义:Provide a way to access the elements of an aggregate object sequentially。定义:Provide a unified interface to a set of interfaces in a subsystem.Facade。 阅读详情

前言

最近在读《敏捷软件开发 原则、模式与实践》,里面提到了几大设计原则,于是想复习下,并且用C#把文中代码重新写一遍

依赖倒置原则(DIP)

概念

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。

一个简单的例子

违反DIP的例子
// Button类(高层策略)直接依赖具体类
public class Button {
    private Lamp itsLamp;  // 糟糕:高层依赖低层
    public void Poll() {
        if (/* 被按下 */) itsLamp.TurnOn();
        else itsLamp.TurnOff();
    }
}

// Lamp类(低层细节)
public class Lamp {
    public void TurnOn() { /* 开灯 */ }
    public void TurnOff() { /* 关灯 */ }
}
符合DIP的改进设计
// 抽象接口由客户(Button)拥有,定义在高层模块
public interface ISwitchableDevice {
    void TurnOn();
    void TurnOff();
}

// Lamp实现抽象接口(细节依赖抽象)
public class Lamp : ISwitchableDevice {
    public void TurnOn() { /* 开灯 */ }
    public void TurnOff() { /* 关灯 */ }
}

// Button只依赖抽象
public class Button {
    private ISwitchableDevice device;  // 依赖抽象
    public Button(ISwitchableDevice device) => this.device = device;
    public void Poll() {
        if (/* 被按下 */) device.TurnOn();
        else device.TurnOff();
    }
}

// 现在可以轻松扩展
public class Motor : ISwitchableDevice { /* 实现 */ }

动态多态 vs 静态多态

考虑一个控制熔炉调节器的软件。该软件可以从一个IO通道中读取当前的温度,并通过向另一个IO通道发送命令来指示熔炉的开或者关。

违反DIP的原始设计
public class FurnaceController {
    private const int THERM_PORT = 0x86;
    private const int FURN_PORT = 0x87;
    
    public void Regulate(double min, double max) {
        while (true) {
            while (ReadHardware(THERM_PORT) > min) Wait(1);
            WriteHardware(FURN_PORT, 1);  // 打开
            while (ReadHardware(THERM_PORT) < max) Wait(1);
            WriteHardware(FURN_PORT, 0);  // 关闭
        }
    }
}
改进方案A:动态多态性(接口)

运行时动态替换实现,支持模拟器测试。

// 抽象接口
public interface IThermometer { double Read(); }
public interface IHeater { void Engage(); void Disengage(); }

// 高层策略依赖抽象
public class Regulator {
    public void Regulate(IThermometer t, IHeater h, double min, double max) {
        while (true) {
            while (t.Read() > min) Wait(1);
            h.Engage();
            while (t.Read() < max) Wait(1);
            h.Disengage();
        }
    }
}

// 具体实现(细节依赖抽象)
public class HardwareThermometer : IThermometer {
    public double Read() => /* 读取硬件0x86 */ 0.0;
}
public class FurnaceHeater : IHeater {
    public void Engage() => /* 操作硬件0x87 */ ;
    public void Disengage() => /* ... */ ;
}
改进方案B:静态多态性(泛型)

性能更高,但类型在编译时固定,更换实现需重新编译。

// 通过泛型实现编译时多态,无需虚函数开销
public class Regulator<TTherm, THeater>
    where TTherm : IThermometer, new()
    where THeater : IHeater, new() {
    
    private TTherm thermometer = new();
    private THeater heater = new();
    
    public void Regulate(double min, double max) {
        while (true) {
            while (thermometer.Read() > min) Wait(1);
            heater.Engage();
            while (thermometer.Read() < max) Wait(1);
            heater.Disengage();
        }
    }
}

// 使用
var regulator = new Regulator<HardwareThermometer, FurnaceHeater>();
regulator.Regulate(20, 25);

参考文献

敏捷软件开发 原则、模式与实践

Stata实战:RCS限制立方样条非线性关系建模与P值解读全攻略 本文详细介绍了在Stata中使用RCS限制立方样条进行非线性关系建模的全过程,包括数据准备、节点设置、COX回归模型构建、结果可视化及P值解读。通过乳腺癌临床数据实例,展示了如何捕捉年龄与死亡风险之间的复杂非线性关系,并提供了实用的Stata代码和图形优化技巧。 阅读详情

相关推荐

第四节、C# 上位机面向对象编程详解(工控硬件继承实战版)

继承核心价值:在 C# 上位机工控开发中,继承的核心是通用逻辑复用与接口统一,将所有硬件的通用属性 / 方法封装到抽象基类,子类只需实现独有逻辑,大幅减少冗余代码。基类设计要点:优先使用抽象基类,合理分配访问修饰符(privateprotectedpublic),定义通用事件与虚方法,提供资源释放机制,兼顾复用性与扩展性。子类设计要点:通过: base()调用基类构造函数,强制实现抽象方法(保证接口统一),选择性重写虚方法(实现独有逻辑),复用基类的protected成员。多设备管理。

kylezhao2019的博客 784

SOLID 设计原则

温故而知新 一, 单一职责原则(Single Responsibility Principle, SRP) 优点: 1) 类的复杂性降低了, 由于我们让每个类的职责单一,因此每个类职责清楚,定义明确。 2) 可读性增强了,复杂性降低了, 类更易于维护了。 3) 变更的风险降低了, 需求一直处于变化,使用SRP原则只需要修改一个接口及它的实现类,对其他类和接口没有影响。 二, 开闭原则 (Open-...

QTperfect1的博客 327

STM32 HAL 硬件IIC驱动BNO085:从移植到姿态解算全流程解析(附源码)

本文详细解析了STM32 HAL库下硬件IIC驱动BNO085 IMU传感器的全流程,包括CubeMX配置、驱动移植、传感器初始化、Q格式数据处理及四元数转欧拉角解算。提供了完整的源码实现和常见问题解决方案,帮助开发者快速掌握高精度姿态测量技术。

palm99的专栏 1047

C++设计模式的设计原则(面向对象八大设计原则)

C++设计模式八大原则的讲解,面向对象八大设计原则的讲解,以简单易懂、有趣论说来讲解八大设计原则

不负AC不负卿的博客 4680

Dify整合FireCrawl与百度搜索实战:手把手教你打造全能研究助手

本文手把手教你基于Dify平台,整合FireCrawl网页爬虫与百度搜索能力,构建一个能同时处理本地文档与实时网络信息的全能研究助手。通过部署核心环境、配置模型、接入两大工具并设计自动化工作流,实现从问题提出到深度分析报告生成的一站式解决方案,极大提升信息调研与整合效率。

weixin_29062963的博客 500

USC EE450 CSCI455 CSCI571 Midterm 总结

EE450 Compter Network                1.历年Midterm考题。(更新至2017年spring,如果大家有新的资源欢迎编辑)                 google drive:https://drive.google.com/drive/folders/0B_LCDxpiiXZ1cUNReFpZZHo4NG8?usp=sharing

Small_hour 7112

【设计原则与思想:总结课】38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

现在,主流的编程范式或者编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。重构的目的:为什么重构(why)?对于项目来言,重构可以保持代码质量持续处于一个可控状态,不至于腐化到无可救药的地步。

qq_32907491的博客 483

【AI智能体】Codex AI 辅助编程高级技能实战操作详解

Codex AI 辅助编程高级技能实战操作详解

congge 6756

【温故而知新】面向对象编程五大原则

在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。 单一职责原则SRP:Single Responsibility Principle   开放封闭原则OCP:Open-Close Principle   Lis...

Z4185146的博客 159

数据本体论如何指导数仓建模?

数据本体论指导数仓建模的核心在于构建业务语义与数据结构的桥梁。该方法从业务域中抽象标准化知识体系,包含核心概念、属性、关系和规则五大要素,并将其映射为分层数仓模型。通过"业务本体梳理→本体建模→模型映射→治理迭代"的流程,实现数仓从"结构存储"到"语义载体"的升级。相比传统建模,该方法能解决语义不一致、跨域融合难等问题,使数仓具备更好的可扩展性和业务对齐性。实践表明,以数据本体论为指导的数仓建模能显著提升数据资产的可理解性和复用价值。

石榴姐yyds 394

configure: error: no acceptable C compiler found in $PATH解决方案

本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

温故而知新之——设计模式(二)

软件开发中,为了提高软件系统的可维护和可复用性,增加软件的可扩展性和灵活性,开发人员尽量根据7条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 开闭原则(Open Closed Principle)由Bertrand Meyer提出。软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension , but c...

小蒋聊技术 196

windows下玩转vllm:在wsl下安装vllm

当前,部署通义千问2.5-vl已经是一件箭在弦上,不得不发的事儿了。网上搜了一下,发现还是用vllm用的比较多。于是乎,这就开始尝试部署vllm。但是我们之前说了,vllm是不支持直接在windows上部署的,我们还得搞wsl或者docker。咱今天先尝试使用wsl进行安装哈。

xiezhipu的博客 4136

温故知新-设计模式篇

01 Mind Map 02 Question&Answer Q1: 什么是反射、它的作用是什么? A: 运行时,动态获取这个类的信息。作用是访问对象的属性、方法、构造函数。 Q2: 反射应用场景? A: JDBC驱动加载、SpringIOC、框架等。 Q3: 反射获取类的方式以及创建对象的方式? A: 3种方式,创建对象:clazz.newInstance()。 Q4: 如何禁止...

阿甘兄 804

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

浅读设计模式之禅(一)

本文是我在读《设计模式之禅》这本书时所提炼出来的一些关键点,比较笼统,是我想在以后用他来温故知识,基本不适用于普通阅读,如有看不明白的地方还望翻书至原章原节.... 一、单一职责原则(SRP):接口一定要做到单一职责,类的设计要尽量做到只有一个原因引起它的变化 二、里氏替换原则(LSP): 1、在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则

u014655027的专栏 502

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java-23种设计模式汇总+6种面向对象设计原则(SOLID)+9种职责分配原则(GRASP)(终)

Java实现的23种设计模式汇总,及面向对象原则解释(SOLID),及指责分配原则解释(GRASP),及面向对象整个实现过程总结(OOA、OOD、OOP)。

大老龙的博客 1375

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++设计模式 温故知新李建忠(BooLan、GeekBand)

设计模式是前人的智慧和经验的总结,需要我们反复地学习、在实践中体会其蕴含的设计原则和设计思想。李老师按照封装变化将23种设计模式分成组件协作、单一职责、对象创建、对象性能、接口隔离、状态变化、数据结构、行为变化和领域问题九类,为我们理解设计模式提供了新角度。 第一讲:设计模式简介 什么是设计模式 “每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 ——Christopher Alexander 如何解决复杂性 1.分

winniwu的博客 2692

C++学习笔记DAY6

是一种通用、可视化的面向对象建模语言,提供统一的、标准化的图形化设计语言和工具集,适用于软件工程领域的分析与设计。UML 常用图表及其作用图表类型中文名作用类图描述系统中类的内部结构以及类与类之间的关系(静态结构)时序图描述对象之间动态交互关系,展现消息在时间轴上的传递顺序协作图展现对象之间的协作关系,描述消息交互和执行顺序时序图 vs 协作图:两者都描述对象间的交互,时序图强调时间顺序,协作图强调组织结构(上下文关系)。

2301_77141494的博客 192

软件架构-设计原则

这几天西安一直下雨,转眼把我们带入到了秋天。工作上越来越难取得进步,给内部集团做项目,没有强有力的领导推动,事情进展很慢。只能在学习上找到突破点,否则每天8个小时,越来越迷茫。复习旧知识,温故而知新。 设计模式是在解决问题的过程中,一些良好思路的经验集成,常见的是GoF 23种设计模式。GoF 23种设计模式的一些指导设计原则: 1、“开闭”原则(OCP):一个软件实体应当对扩展开放,...

weixin_33704234的博客 108

设计模式之设计原则

之前在做 .Net的时候就买了《Head First 设计模式》,也看了一下,由于看的也不深入,理解上不是太深,特别是没有动手敲一下,最近闲的蛋蛋疼,也想着跳槽,但觉得要沉住气,耐得住寂寞,不能跳槽太频繁,这样对职业生涯不好,所以趁着没事做,就试着把它再看一遍,书读百遍,其意自现嘛。当时在学校学软件工程课程时也讲过设计的基本原则,不过当时主要是理论也没实...

weixin_33806509的博客 77

浅瞥JAVA设计模式

今天学了比较高深的设计模式的相关知识。我挺老实讲都有些头大,差点就下意识的跑神儿。但是为了温故,就冒犯一下JAVA写篇关于设计模式的文章。仅是知识简单记录而已,这些设计理念是需要代码来沉淀的,就算先混个脸熟吧。 JAVA 6 种设计原则 (本应配合具体例子代码,但目前我还没有这个能力) 六中设计模式分别是:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪...

anlx27的专栏 152

【第21期】以实际项目作驱动,换种方式学Java

Java作为OOP(面向对象编程)的集大成者,融合了其他语言的诸多优点,让开发者体验到了函数式编程的精妙及强大之处。随着这几年开源社区的蓬勃发展,越来越多的组件、框架、方案如雨后春笋般涌...

华章IT官方博客 336

代码规范七大原则_设计模式系列:七大原则(笔记一)

之前一直想整理一些关于设计模式相关的内容,客观上来说是因为工作比较忙没有时间来干这件事情,主观上来说还是因为自己懒癌晚期,工作之余根本不想动。先终于下定决心结合工作中常用的框架通过图文的方式来介绍Gof中的23个设计模式,加上“简单工厂模式”的话一共有24个模式可介绍。在介绍具体的设计模式之前,本文先介绍设计模式的基础概念以及设计模式所需要遵循的七大原则。一、设计模式的概念设计模式:是指在软件开发...

weixin_39608116的博客 1678

读Android源码设计模式解析与实战(第一章面向对象的六大原则)

买了很多书,也看了很多,但有一个毛病就是看的时候很明白,但是看过不久就忘了,可见温故而知新是很重要的,所以想重拾上学时的习惯,记笔记好了,经常来看看,记录下看的时候的心得、体会。鼓励自己坚持下去     OOP在java中很重要,提到OOP就会想到面向对象的六大原则,说实话我的android开发算是自学的,大学也不是学的计算机,所以计算机基础不是特别厉害,当然就说明我的java功底薄弱呀,对面向

qq_35366908的博客 408
上一篇: 【温故】设计原则:接口隔离原则
下一篇: Unity有限状态机 一个支持消息调度系统的泛型状态机
ZZHSourceCode
博客等级 码龄9年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值