依赖倒转原则

1.1 MM请求电脑

MM电脑坏了,需要修电脑,是因为每次打开QQ,一玩游戏,机器就死了。出来蓝底白字的一堆莫名奇妙的英文。蓝屏死机了,估计内存有问题。

1.2 电话遥控修电脑

遥控修理电脑,打开内存条,两根内存条拔掉一个试试,最终有一个是好的,电脑修好了。

1.3 依赖倒转原则

蓝屏通常是内存本身有问题或内存与主板不兼容,主板不容易换,但是内存更换起来容易。

强内聚,松耦合。

依赖倒转原则是抽象不应该依赖细节,细节应该依赖于抽象,就是要针对接口编程,不要对实现编程。

依赖倒转原则
(1)高层模块不应该依赖低层模块。两个都应该依赖抽象。
(2)抽象不应该依赖细节。细节应该依赖抽象。

这里面是需要好好解释一下,面向过程的开发时,为了使得常用代码可以复用,一般都会把这些常用代码写成许许多多函数的程序库,这样我们在做新项目时,去调用这些低层的函数就可以了。比如我们做的项目大多要访问数据库,所以我们就把访问数据库的代码写成了函数,每次做新项目时就去调用这些函数。这也就叫作高层模块依赖低层模块。"
"嗯,是这样的,我以前都是这么做的。这有什么问题?"
"问题也就出在这里,我们要做新项目时,发现业务逻辑的高层模块都是一样的,但客户却希望使用不同的数据库或存储信息方式,这时就出现麻烦了。我们希望能再次利用这些高层模块,但高层模块都是与低层的访问数据库绑定在一起的,没办法复用这些高层模块,这就非常糟糕了。就像刚才说的,PC里如果CPU、内存、硬盘都需要依赖具体的主板,主板一坏,所有的部件就都没用了,这显然不合理。反过来,如果内存坏了,也不应该造成其他部件不能用才对。而如果不管高层模块还是低层模块,它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,那么任何一个更改都不用担心其他受到影响,这就使得无论高层模块还是低层模块都可以很容易地被复用。这才是最好的办法。"
"为什么依赖了抽象的接口或抽象类,就不怕更改呢?"不好意思,我有些钻牛角尖了。"
"没有,没有,在这里弄不懂是很正常的,原因是我少讲了一个设计原则,使得你产生了困惑,这个原则就是里氏代换原则。"

1.4 里氏替换原则

"里氏代换原则是Barbara Liskov女士在1988年发表的[ASD],具体的数学定义比较复杂,你可以查相关资料,它的白话翻译就是一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化,简单地说,子类型必须能够替换掉它们的父类型[ASD]。"
里氏代换原则(LSP):子类型必须能够替换掉它们的父类型。[ASD]
"这好像是学继承时就要理解的概念,子类继承了父类,所以子类可以以父类的身份出现。"
"是的,我问你个问题,如果在面向对象设计时,一个是鸟类,一个是企鹅类,如果鸟是可以飞的,企鹅不会飞,那么企鹅是鸟吗?企鹅可以继承鸟这个类吗"
"企鹅是一种特殊的鸟,尽管不能飞,但它也是鸟呀,当然可以继承。"
"哈,你上当了,我说的是在面向对象设计时,那就意味着什么呢?子类拥有父类所有非private的行为和属性。鸟会飞,而企鹅不会飞。尽管在生物学分类上,企鹅是一种鸟,但在编程世界里,企鹅不能以父类——鸟的身份出现,因为前提说所有鸟都能飞,而企鹅飞不了,所以,企鹅不能继承鸟类。"


"哦,你的意思我明白了,我受了直觉的影响。小时候上课时老师一再强调,像鸵鸟、企鹅等不会飞的动物也是鸟类。所以上面的图,如果要让企鹅继承鸟,那么让鸟有下蛋的方法可以,但有飞的方法就不对了。"
"也正因为有了这个原则,使得继承复用成为可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。比方说,猫是继承动物类的,以动物的身份拥有吃喝、移动(跑、飞、游等)等行为,可当某一天,我们需要狗、牛、羊也拥有类似的行为,由于它们都是继承于动物,所以除了更改实例化的地方,程序其他处不需要改变。"


"我的感觉,由于有里氏代换原则,才使得开放-封闭成为可能。"小菜说。
"这样说是可以的,正是由于子类型的可替换性才使得使用父类类型的模块在无须修改的情况下就可以扩展。不然还谈什么扩展开放,修改关闭呢?再回过头来看依赖倒转原则,高层模块不应该依赖低层模块,两个都应该依赖抽象,对这句话你就会有更深入的理解了。"


"哦,我明白了,依赖倒转其实就是谁也不要依靠谁,除了约定的接口,大家都可以灵活自如。还好,她没有问我如何修收音机,收音机里都是些电阻、三极管,电路板等东西,全都焊接在一起,我可不会修的。"小菜庆幸道。


1.5 修收音机


"收音机就是典型的耦合过度,只要收音机出故障,不管是没有声音、不能调频,还是有杂音,反正都很难修理,不懂的人根本没法修,因为任何问题都可能涉及其他部件,各个部件相互依赖,难以维护。非常复杂的电脑可以修,反而相对简单的收音机不能修,这其实就说明了很大的问题。当然,电脑的所谓修也就是更换配件,CPU或内存要是坏了,老百姓是没法修的。现在在软件世界里,收音机式的强耦合开发还是太多了,比如前段时间某银行出问题,需要服务器停机大半天的排查修整,这要损失多少钱。如果完全面向对象的设计,或许问题的查找和修改就容易得多。依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。

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

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

相关文章

Vivado使用(6)——增量综合( Incremental Synthesis)

目录 一、概述 1.1 增量综合的工作原理 1.2 增量综合的优点 1.3 注意事项 二、设置增量综合 2.1 Write Incremental Synthesis 复选框 2.2 Incremental Synthesis 选择框 2.2.1 自动使用上一次运行的检查点(Automatically use the checkpoint from the…

Vue(十二):脚手架配置代理,github案例,插槽

一、脚手架配置代理 老师讲的主要有两种方法: 但是我的没有proxy,只有proxyTable,之前一直不成功,现在我是这样配置的: config文件夹下的index.js: App.vue: 然后就成功了:(我真服了,之前在这…

jdbc连SQL server,显示1433端口连接失败解决方法

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接…

零基础入门实战深度学习Pytorch课程下载

本课程旨在帮助零基础学员掌握PyTorch深度学习框架。通过实战项目,学员将学习神经网络基础、模型训练和调优技巧。逐步掌握深度学习核心概念,为未来在人工智能领域打下坚实基础。 课程大小:2.6G 课程下载:https://download.csdn.net/downlo…

【战略前沿】与中国达成生产协议后,飞行汽车即将起飞

【原文】Flying cars edge towards takeoff after Chinese production deal 【作者】Thomas Macaulay 斯洛伐克公司KleinVision签署了一项协议,将大规模生产AirCar。 一辆获得航空认证的飞行汽车向商业化又迈出了一大步。 空中汽车的创造者KleinVision今天宣布出售…

【经验分享】Ubuntu下如何解决问题arm-linux-gcc:未找到命令

【经验分享】Ubuntu下如何解决问题arm-linux-gcc:未找到命令 前言问题分析解决方法 前言 在编译过程中发现一个问题,明明之前安装了gcc-4.6版本,版本信息都是正常显示的,刚安装上去的时候也是可以用的。但不知道什么原因突然不能…

HUAWEI 华为交换机 配置 Eth-Trunk 接口流量本地优先转发示例(堆叠)

组网需求 说明 S5720I-10X-PWH-SI-AC 和 S5720I-6X-PWH-SI-AC 不支持此配置。 如 图 3-23 所示,为了增加设备的容量采用设备堆叠技术,将 Switch3 和 Switch4通过专用的堆叠电缆链接起来,对外呈现为一台逻辑交换机。为了实现设备间的备份、…

Windows基线安全检测-安全配置检测

Windows基线安全检测-安全配置检测 前言 Windows在生产环境中是使用最多的一个系统,大部分为客户端,少部分为服务端; 然而其实很多用户对windows系统不是很了解,安全配置更是如此; 因此我们安全人员要定期对员工的主…

中科驭数DPU技术开放日秀“肌肉”:云原生网络、RDMA、安全加速、低延时网络等方案组团亮相

2024年3月29日,中科驭数以“DPU构建高性能云算力底座”为主题的线上技术开放日活动成功举办。在开放日上,中科驭数集中展现了其在低时延网络、云原生网络及智算中心网络三大关键场景下的技术成果与五大核心DPU解决方案,凸显了中科驭数在高性能…

RabbitMQ安装及Springboot 集成RabbitMQ实现消息过期发送到死信队列

死信队列 RabbitMQ 的死信队列(Dead-Letter-Exchanges,简称 DLX)是一个强大的特性,它允许在消息在队列中无法被正常消费(例如,消息被拒绝并且没有设置重新入队,或者消息过期)时&…

1236. 递增三元组:做题笔记

目录 暴力 代码 二分 代码 前缀和 代码 推荐视频讲解 暴力 这道题说的是有三个元素数量相同的数组,想知道有多少个三元组满足:三个数分别来自 A B C数组且呈现递增。 我想的是既然要求递增,那就先把数组数据都排一下序,…

springCloudAlibaba集成gateWay实战(详解)

一、初识网关? 1、网关介绍 ​ 在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话…

【opencv】教程代码 —features2D(8)AKAZE 特征点匹配和图像拼接

graf1.png graf3.png <?xml version"1.0"?> <opencv_storage> <H13 type_id"opencv-matrix"><rows>3</rows><cols>3</cols><dt>d</dt><data>7.6285898e-01 -2.9922929e-01 2.2567123e02…

matlab碰撞检测

文章目录 碰撞对象collisionCylindercollisionBoxcollisionMeshcollisionSpherecollisionCapsulecheckCollisionfitCollisionCapsuleshowCollisionArraycapsuleApproximationaddCapsuleremoveCapsuleconvertToCollisionMesh碰撞对象 函数功能checkCollision检测两几何体是否存在…

前端之CSS——网页的皮肤!!

目录 一、CSS简单介绍 二、css内容 2.1 css的编写方式 2.2 css选择器 2.3 样式属性 2.4 css包围盒 2.5 css中的display 2.6 css中的定位 2.7 css中的浮动与清除 2.7 弹性容器 2.8 字体图标 2.9 …

1.5编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。

1、编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。 package com.kangning.web.controller.system;import java.util.Scanner;/*** 编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。*/ public class CountArea {public static void main(String[] args) …

面向对象编程中的StringBuffer类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【Linux 驱动基础】设备树驱动

# 前置知识 在图中&#xff0c;树的主干就是系统总线&#xff0c; IIC 控制器、 SPI 控制器等都是接到系统主线上的分支。其中 IIC1 上接了 AT24C02这个 IIC 设备&#xff0c; DTS 文件的主要功能就是按照图所示的结构来描述板子上的设备信息。 1. Device格式 DTS文件格式 …

【论文阅读】ELA: Efficient Local Attention for Deep Convolutional Neural Networks

&#xff08;ELA&#xff09;Efficient Local Attention for Deep Convolutional Neural Networks 论文链接&#xff1a;ELA: Efficient Local Attention for Deep Convolutional Neural Networks (arxiv.org) 作者&#xff1a;Wei Xu, Yi Wan 单位&#xff1a;兰州大学信息…

基于架构的软件开发方法_1.概述和相关概念及术语

1.体系结构的设计方法概述 基于体系结构的软件设计&#xff08;Architecture-Based Software Design&#xff0c;ABSD&#xff09;方法。ABSD方法是由体系结构驱动的&#xff0c;即指由构成体系结构的商业、质量和功能需求的组合驱动的。 使用ABSD方法&#xff0c;设计活动可以…