所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。
依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
public
interfaceICar
{
void
Run();
Turn();
Stop();
}
public
class
BmwCar:ICar
{
Run()
{
Console.WriteLine(
"宝马开始启动了"
);
}
Turn()
{
"宝马开始转弯了"
);
}
Stop()
{
"宝马开始停车了"
);
}
}
FordCar:ICar
{
publicvoidRun()
{
"福特开始启动了"
);
}
Turn()
{
"福特开始转弯了"
);
}
Stop()
{
"福特开始停车了"
);
}
}
HondaCar:ICar
{
publicvoidRun()
{
"本田开始启动了"
);
}
Turn()
{
"本田开始转弯了"
);
}
Stop()
{
"本田开始停车了"
);
}
}
AutoSystem
{
private
ICaricar;
AutoSystem(ICaricar)
{
this
.icar=icar;
}
private
runcar()
{
icar.Run();
}
TurnCar()
{
icar.Turn();
}
StopCar()
{
icar.Stop();
}
}
|
传递依赖关系有三种方式,以上的例子中使用的方法是接口传递,另外还有两种传递方式:构造方法传递和setter方法传递,相信用过Spring框架的,对依赖的传递方式一定不会陌生。
在实际编程中,我们一般需要做到如下3点:
低层模块尽量都要有抽象类或接口,或者两者都有。
变量的声明类型尽量是抽象类或接口。
使用继承时遵循里氏替换原则。
总之,依赖倒置原则就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。
原文地址:https://www.jb51.cc/javaschema/284881.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。