设计模式:依赖反转

一直说依赖反转,但是没明白是不太清晰什么是依赖反转。

最近看了 《敏捷软件开发:原则、模式与实践》这本书中说的依赖反转,结合自己的常写的代码,有一点新的见解。

以咱们常见的手机充电器为例:

比如我有Nokia X2手机(nokia出品的安卓机,本人手机这块比较节省),手机正常来说需要依赖手机充电器来进行充电。

我的Nokia手机用的就是Nokia配套的充电器。

1 class NokiaPhone{
2  private NokiaCharger charger;
3
4  public void charge(){
5   charger.charge()
6  }
7 }

如果类设计成这样呢,NokiaPhone 强依赖的是 NokiaCharger , 而NokiaCharger不依赖任何类【1】。

为什么呢?因为NokiaPhone类里面充电器的类型是NokiaCharger已经强制写死了。

  但是我们发现,其它Android手机只要是Mini Usb接口的充电器,我的Nokia手机都能用它来充电。

如果我们的NokiaPhone类设计中充电器类型还是NokiaCharger的话,则不能满足需求。

我们这时候修改一下 NokiaPhone的设计。

class NokiaPhone{
 private MiniUSBCharger charger;

 public void charge(){
  charger.charge()
 }
}

interface MiniUSBCharger{
 void charge();
}

我们发现,这是 NokiaPhone 强依赖的是 MiniUSBCharger。而 NokiaCharger需要实现 MiniUSBCharger接口,因此NokiaCharger强依赖MiniUSBPhone【2】。

综合【1】与【2】来看,我们可以看到,NokiaPhone的强依赖无论是NokiaCharger还是MiniUSBCharger都是强依赖,这不变。

而实现了 NokiaCharger从什么都不依赖,到依赖MiniUSBCharger的反转【反转的结论】。

结论:很简单,当依赖一个具体类的时候,想想是不是应该抽象一个满足当前需求的接口出来,然后依赖该接口。

这样有利于后面的扩展,而扩展只需要满足你按照需求设计的接口。

时间: 2024-08-25 13:03:53

设计模式:依赖反转的相关文章

依赖反转(Dependency inversion principle)和控制反转(Inversion of Control)

有两个对象A和B,A some B  是A依赖于B,当B some A的时候是B依赖于A这就叫依赖反转: 这种依赖关系如果让程序员自己控制(new 对象),就会出现高耦合,控制反转(依赖注入)就是让这种依赖关系由第三方管理(eg:spring)而不是程序员自己管理. 名词解释 依赖:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A依赖于类B. 耦合:一种模型元素之间的关系的描述.例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系. 耦合度:模型元素之间的依赖程度的

IOC容器和依赖反转模式

在这里,我们先简要地讨论依赖反转的相关概念.我们选取维基百科中关于体赖反转的叙述,把这些文字作为我们理解依赖反转这个概念的参考.这里不会对这些原理进行学理.上的考究,只是希望提供-些有用的信息,以便给读者一些自示.这个模式非常重要,它是IoC容器得到广泛应用的基础.        维基百科对"依赖反转"相关概念的叙述 平在2004年.Martin Fowler就提出了"哪些方面的控制被反转了?"这个问题.他得出的结 论是依赖对象的获得被反转了.基于这个结论,他为控制

依赖反转Ioc和unity,autofac,castle框架教程及比较

1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 http://www.cnblogs.com/muzinian/p/3357741.html 于依赖反转原则.控制反转和依赖注入的抽象的初学者指南 3.主流ioc框架 http://www.cnblogs.com/bchp/articles/1527693.html http://www.cnbl

SpringIoc依赖注入依赖反转

Ioc容器主要实现的是控制反转,控制反转的实现手段是依赖注入,即原来具有依赖关系的类原先是由程序员自己new实例进行管理,现在是由spring容器来管理,当一个类需要另外一个类时,spring容器通过依赖注入的方式来实现.那么依赖注入的实现依靠的是依赖反转. 依赖反转:高级类获得低级类提供的服务,如果希望当低级类发生改变时高级类不发生改变,依赖反转是一个好的实现.依赖反转使得高级类依赖于低级类的抽象,低级类的实现依赖于低级类的抽象,这样原本强耦合的结构就能解耦了,他们相互依赖于抽象,抽象又是较为

Angular的依赖注入(依赖反转)原理说明

依赖注入(依赖反转)意思是由函数决定要引入什么样的依赖: let mod = angular.module('test',[]); mod.controller('test_c',function($scope,$interval){ //这里就引入两个依赖$scope和$interval }) //神奇的是我所引入的依赖不受顺序.个数影响 //下面运用这些依赖的时候仍然杠杠的 mod.controller('test_c2',function($interval,$http,$scope){

依赖反转原则DIP 与 asp.net core 项目结构

DIP 依赖反转原则 Dependency Inversion Principle 的定义如下: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 假设Controller依赖于Repository的实例/实现, 而不是interface: 这个例子里面Controller是高级别模块, Repository是低级别模块. 但是根据定义: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 那么如何解决这个问题呢? 那就是 从Repository中提炼出一个interf

依赖反转原则

控制反转(IOC) 举例说明 public class UserServiceTest { public static boolean doTest() { // ... } public static void main(String[] args) {//这部分逻辑可以放到框架中 if (doTest()) { System.out.println("Test succeed."); } else { System.out.println("Test failed.&qu

小菜学设计模式——依赖倒转原则

背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习<大话设计模式>时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅. 真诚的希望自己能够从一名小菜成长为一名大鸟! 编写的程序应该满足: 1)可维护 2)可扩展 3)可复用 4)够灵活 废话少说,言归正传,设计模式原则之:依赖倒转原则 书面理解 依赖倒转原则: A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象. B.抽象不应该依赖于具体,具体应该依赖于抽象. 简单

增删改查也有设计模式——依赖倒置原则另解

一个增删改查的例子解读面向接口编程和依赖倒置原则 依赖倒置原则介绍 依赖倒置原则包括两个部分 .高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象. 抽象不应该依赖于具体实现,具体实现应该依赖于抽象. 例子 现在有如下场景和需求:老板要求设计任务模块,包括发布任务和撤回任务等.假设这个需求只给了几个小时去做,那肯定是来不及设计了,写到哪算哪.定义撤回接口的控制层如下 @RequestMapping('cancel') @ResponseBody public String cancelT