OOP的几个原则-----DIP:依赖倒置原则(下)

我们来看一个有关一个类向另一个类发送消息的示例:Button对象感知外部环境的变化,当接收到Poll指令后,它会控制Lamp对象的显示或熄灭.

如何设计一个用Button对象控制Lamp对象的系统呢?通常我们会按照下图的意思去实现这个功能.

 

 

在这里,Button类直接依赖于Lamp类,当它接收到Poll消息后,判断按钮是否被按下,接着简单的发送TurnOn或者TurnOff消息给Lamp.按照这样的实现,当Lamp类改变时,Button类会收到影响.此外想让Button控制一个Motor对象是不可能的,它只能控制Lamp对象.这个方案违反了DIP.应用程序的高层策略没有和低层分离.抽象没有和具体细节分离.没有这种分离,高层策略就自动地依赖低层模块,抽象就自动地依赖具体细节.

仔细想想什么是高层策略?它应该是应用背后的抽象,是那些不随具体细节改变而改变的真理.在Button/Lamp例子中,背后的抽象是检测用户的开/关指令并将指令传给目标对象.具体用什么机制检测用户指令,目标对象是什么都无关紧要.

从上面的改进图中我们可以看出Button现在和一个ButtonServer的接口关联起来,Button现在可以开/关一些东西.Lamp实现了ButtonServer接口.这样,Lamp现在依赖于其他东西而不是被依赖.不过这个方案对那些需要被Button控制的对象提出了一个约束,需要被Button控制的对象必须实现ButtonServer接口,但是它去没有依赖于Button.它们之间仅仅只是名字上的依赖.所以接口没有所有者,它可以被许多不同的客户类使用,并且被许多不同的服务者实现.这样,接口就需要独立存在而不属于任何一方,我们可以把它放在一个单独的命名空间或者库中.

 

结论:

使用传统的过程化程序设计所创建出来的依赖关系结果,策略是依赖细节的.这是糟糕的,因为这样会使策略受到细节改变的影响.面向对象的程序设计倒置了依赖关系结构,使得细节和策略都依赖于抽象,并且常常是客户程序拥有服务接口.

事实上,这种依赖关系的倒置正是好的面向对象设计的标志所在.使用何种语言来编写程序是无关紧要的.如果程序的依赖关系是倒置的.它就是面向对象的设计.如果程序的依赖关系不是倒置的,它就是过程化的设计.

 

转载于:https://www.cnblogs.com/bit64/archive/2012/03/16/2397239.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值