设计模式6大原则之-依赖倒置原则

面向过程用户程序 的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。
面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度

所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

问题由来:A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

         依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。


例:
这儿有一个“AutoSystem”类,它包含一个“ICar”接口。这个“AutoSystem”类根本不依赖于“FordCar”和“HondaCar”。所以,依赖关系被“倒置”了:“AutoSystem”模块依赖于抽象,那些具体的汽车操作也依赖于相同的抽象。
于是可以添加ICar
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  interface ICar
{
void  Run();
void  Turn();
void  Stop();
}
public  class  BmwCar:ICar
{
public  void  Run()
{
Console.WriteLine( "宝马开始启动了" );
}
public  void  Turn()
{
Console.WriteLine( "宝马开始转弯了" );
}
public  void  Stop()
{
Console.WriteLine( "宝马开始停车了" );
}
}
public  class  FordCar:ICar
{
publicvoidRun()
{
Console.WriteLine( "福特开始启动了" );
}
public  void  Turn()
{
Console.WriteLine( "福特开始转弯了" );
}
public  void  Stop()
{
Console.WriteLine( "福特开始停车了" );
}
}
public  class  HondaCar:ICar
{
publicvoidRun()
{
Console.WriteLine( "本田开始启动了" );
}
public  void  Turn()
{
Console.WriteLine( "本田开始转弯了" );
}
public  void  Stop()
{
Console.WriteLine( "本田开始停车了" );
}
}
public  class  AutoSystem
{
private  ICar icar;
public  AutoSystem(ICar icar)
{
this .icar=icar;
}
private  void  RunCar()
{
icar.Run();
}
private  void  TurnCar()
{
icar.Turn();
}
private  void  StopCar()
{
icar.Stop();
}
}
现在AutoSystem系统依赖于ICar 这个抽象,而与具体的实现细节HondaCar、FordCar、BmwCar无关,所以实现细节的变化不会影响AutoSystem。对于实现细节只要实现ICar 即可,即实现细节依赖于ICar 抽象。


   传递依赖关系有三种方式,以上的例子中使用的方法是接口传递,另外还有两种传递方式:构造方法传递setter方法传递,相信用过Spring框架的,对依赖的传递方式一定不会陌生。

         在实际编程中,我们一般需要做到如下3点:

         低层模块尽量都要有抽象类或接口,或者两者都有。

         变量的声明类型尽量是抽象类或接口。

         使用继承时遵循里氏替换原则。

总之,依赖倒置原则就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值