依赖倒转原则
DIP / Dependency inversion principle
尚硅谷设计模式-学习笔记
----------------依赖倒转原则基本介绍
- 高层模块不应该依赖底层模块,两种都应该依赖其抽象(接口或者抽象类)
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒转/依赖倒置的中心思想是面对接口编程
- 依赖倒转原则基于这样的设计理念:
相对于细节的多变性,抽象的东西要稳定的多。
以抽象为基础搭建的架构比以细节为基础的架构要稳定得多。
在Java中,抽象指的是接口或者抽象类,细节就是具体的实现类 - 使用接口或者抽象类的目的就是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
----------------依赖倒转原则实例
实例:请编程完成Person 接收消息的功能
对比传统方案和遵守原则的方案
Example:传统方案
public class DIP1 {
public static void main(String[] args) {
Person p = new Person();
p.receive(new Email());
}
}
//完成Person接收消息的功能
//注意,这个地方Person类的方法依赖Email类
//这种方式比较简单,比较容易想到
//但是如果我们获取的对象不止邮件,还有微信,短信。则我们需要新增类,Person类还需要增加新的接收方法
//解决思路:引入一个抽象的接口IReceiver表示接收者,这样Person类与这个接口发生依赖
//这样做有什么好处呢?
// 因为Email, 微信等等属于接收的范围,他们各自实现了IReceiver这个接口,就符合了依赖倒转原则
class Person{
public void receive(Email email) {
System.out.println(email.getInfo());
}
}
class Email{
public String getInfo() {
return "电子邮件信息 : Hello World";
}
}
.
Example: 改进方案(遵守依赖倒转原则)
public class DIP2 {
public static void main(String[] args) {
//客户端无需改变
Person p = new Person();
p.receive(new Email());
p.receive(new Weixin());
}
}
//定义一个接口IReceiver
interface IReceiver{
public String getInfo();
}
class Person{
public void receive(IReceiver receiver) {
//这里的依赖的由Email类变成了IReceiver接口
System.out.println(receiver.getInfo());
}
}
class Email implements IReceiver{
public String getInfo() {
return "电子邮件信息 : Hello World";
}
}
//增加微信类
class Weixin implements IReceiver{
public String getInfo() {
return "微信信息 : Hello World";
}
}
.
----------------依赖倒转原则 注意事项和细节
- 底层模块尽量都要有抽象类和接口,或者两者都有,程序稳定更好
- 对象的声明类型尽量为抽象类或者接口,这样我们的对象和类间,就存在一个缓冲层,利于程序扩展和优化
- 继承时遵循里氏替换原则
来源:CSDN
作者:常见的诺恩
链接:https://blog.csdn.net/week77/article/details/102559800