第5章 设计原则—依赖倒转原则

本文探讨了面向对象设计的两个重要原则:依赖倒转原则和里氏替换原则。依赖倒转原则强调高层模块不应依赖底层模块,两者应依赖抽象,避免直接依赖具体实现。里氏替换原则保证子类可以替换父类并保持软件行为的一致性。这两个原则促进了代码的可复用性和可扩展性,降低了系统的耦合度。遵循这些原则,开发者可以创建更稳定、易于维护的软件系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PC电脑里的易拔插——强内聚,松耦合

依赖倒转原则(依赖倒置原则):抽象不应该依赖细节,细节应该依赖于抽象(针对接口编程,通过抽象的接口交互,抽象出顶层的接口叫抽象不依赖于细节一个函数的具体实现如果用到了其他接口的功能
只需要调用其他功能模块的接口即可,这叫细节依赖于抽象)
针对接口编程,不要对实现编程

依赖倒转原则:
A.高层模块不应该依赖底层模块。两个都应该依赖抽象。
B.抽象不应该依赖细节。细节应该以来抽象。

为什么叫倒转呢?
面向过程的开发时,为了使得常用代码可以复用,一般都会把这些常用代码写成许许多多函数的程序库,当我们在做新项目时,去调用这些低层的函数就可以了。比如我们做的项目大多要访问数据库,所以我们就把访问数据库的代码写成了函数(封装到函数库中),每次做新项目时就去调用这些函数。这就叫做高层模块依赖底层模块。
问题也就出现在这里,当我们要做新项目时,发现业务逻辑的高层模块都是一样的,但客户希望使用不同的数据库或存储信息方式,就有问题了。我们希望能再次利用这些高层模块,但高层模块都是与低层的访问数据库绑定在一起的,没办法复用这些高层模块,这就非常糟糕了。(例如,如果程序中使用专门用来连接oracle数据库的连接访问函数,当想复用业务代码,替换数据连接访问操作时则需要修改程序,修改数据库连接访问操作部分代码适应新的数据库,如果面向了接口编程则
不需要修改业务中的代码,因为业务代码中访问操作数据部分使用的是接口)。如果不管高层模块还是低层模块,它们都依赖于抽象,具体一点就是接口或抽象,只要接口稳定,那么任何一个的更改都用担心其他收到影响,使得无论高层模块还是低层模块都可以很容易地被复用。

5.4 里氏替换原则

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单说就是子类型必须能够替换掉它们的父类型。

概念:
里氏替换原则:子类型必须能够替换掉它们的父类型。

和C++中父类指针指向之类对象,或者父类引用指向子类对象是一个概念。
也正因为有了这个原则,使得继承复用成为了可能。只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
在程序中软件行为不变,但是行为的具体实现有变化,只需要更改类实例化的地方即可,其他地方不需要更改。比如,计算器中求两个数的运算,用到的是运算这个功能点(函数点),具体的运算内的实现过程是可改变的。

由于有里氏替换原则,才使得开放-封闭成为了可能
正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展(只需要修改实例化的地方,如果实例化对象部分封装了起来则只需要通过传递参数符号即可)。

高耦合软件程序中任何问题都可能涉及其他部分,各个部件相互依赖,难以维护。

依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是面向过程化的设计了。

### 解决 IntelliJ IDEA 中 `@Autowired` 注解导致的红色波浪线错误 在使用 Spring 框架时,如果遇到 `@Autowired` 注解下的依赖注入对象显示为红色波浪线错误或者黄色警告的情况,通常是由以下几个原因引起的: #### 1. **Spring 插件未启用** 如果 Spring 支持插件未被激活,则可能导致 IDE 无法识别 `@Autowired` 或其他 Spring 特定的功能。可以通过以下方式解决问题: - 打开设置菜单:`File -> Settings -> Plugins`。 - 确认已安装并启用了名为 “Spring Framework Support” 的官方插件[^1]。 #### 2. **项目配置文件缺失或正确** Spring 需要通过 XML 文件、Java Config 类或其他形式来定义 Bean 定义。如果没有正确加载这些配置文件,可能会导致 `@Autowired` 报错。 - 确保项目的 `applicationContext.xml` 或者基于 Java 的配置类(带有 `@Configuration` 和 `@Bean` 注解)已被正确定义和引入。 - 对于 Spring Boot 项目,确认是否存在 `spring.factories` 文件以及是否包含了必要的组件扫描路径[^3]。 #### 3. **模块依赖关系问题** 当前模块可能缺少对 Spring Core 或 Context 组件库的有效引用。这可能是由于 Maven/Gradle 构建工具中的依赖项声明足造成的。 - 检查 `pom.xml` (Maven) 或 `build.gradle` (Gradle),确保包含如下核心依赖之一: ```xml <!-- For Maven --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> ``` ```gradle // For Gradle implementation 'org.springframework:spring-context:${springVersion}' ``` - 更新项目依赖树以应用更改:右键点击项目根目录 -> `Maven -> Reload Project` 或运行命令 `./gradlew build --refresh-dependencies`。 #### 4. **IDE 缓存损坏** Intellij IDEA 的缓存机制有时会因各种因素而失效,从而引发误报错误。清除缓存可以有效缓解此类情况。 - 使用快捷组合键 `Ctrl + Alt + Shift + S` 进入项目结构对话框;也可以尝试执行操作序列:`File -> Invalidate Caches / Restart... -> Invalidate and Restart`. #### 5. **启动异常影响正常解析** 若之前存在类似 `com.intellij.diagnostic.PluginException` 的严重初始化失败日志记录,则表明某些关键服务未能成功加载,进而干扰到后续功能表现[^2]。建议重新下载最新稳定版本的 IDEA 并按照标准流程完成初次部署工作。 ```java // 示例代码片段展示如何正确运用 @Autowired 注解实现自动装配 @Service public class StudentService { private final Repository repository; public StudentService(@Qualifier("specificRepository") Repository repo){ this.repository = repo; } } @Component class SpecificComponent{ @Autowired private transient StudentService studentService; // 此处应无任何编译期告警现象发生 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值