文档章节

关于依赖反转(基于接口编程)和依赖注入的一个小问题的领悟

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 1235
阅读 8
收藏 0

  这两天学习设计模式,看到了关于依赖反转方面的东西,就依赖反转而言简单来说就是:软软设计存在抽象层和实现层之分,一般情况下是抽象依赖于实现,这很容易理解,但是问题在于抽象层相对稳定,实现层容易变化,抽象层应该具有较实现层更高的复用性,它就应该我们设计和考量的核心与重点,而不是具体的实现,这样一来,要求我将依赖关系反转过来,即实现应该依赖于我们的抽象,这样的设计才是灵活和易于扩展的。如此一来,依赖反转的概念就出来了,但是如果实现依赖反转呢?答案听上去是很简单的那就是基于接口进行编程,关于这一点在许多讲述设计模式的书中都有所介绍,接口是对类和方法的一组需求定义,由于接口不提供任何实现,它是一种最纯的抽象,基于接口进行编程可以真正意义上实现在抽象层上进行工作。但是还有一个恼人的小问题:

interface IService

{

 public void doSomething();

}

class ServiceImpl implements IService

{
 public void doSomething()
 {
  // do something......
 }
}

class Component
{

private  IService service=new ServiceImpl(); //这里是基于接口进行编程,但却在构造时与具体的实现发生了耦合

//后继方法中会使用该service

}

问题就出在对service的实例化上,我们可以明确的看到接口service在实例化时要不可避免地使用到它的实现类,从而导致了 service至少在创建时刻对具体实现产生了依赖,这使得我们之前打算的基于接口进行编程的工作似乎功亏一篑。在一些设计模式的书中对于这一问题的解决方法是使用工厂模式,来实现对service实例化的封装。

  呵呵,写到这里禁不住要偷笑了,因为晚上在思考这个问题的时候实然想到了spring的依赖注入,不禁恍然大悟:不需使用什么工厂模式,运用spring的依赖注入会完美地解决“抽象在创建时刻对实现产生依赖”的问题,在我们代码里,抽象将永远不需要再被指向他的具体实现了,这个过程会放到sping 的配制文件里,使用依赖注入的方式完成,这样了,我们真得就可以完美使用接口进行编程了!

 

 

以下内容是2010-5-8的补充:

 

     在我刚开始接触spring和IOC理论时,最常见的IOC示例就是Service依赖DAO时,在Service的实现类里声明一个DAO字段,通常这个DAO是一个接口,然后提供一个setter,就在Service的方法中开始使用这个DAO了,整个Service没有实例化这个DAO的操作。其实这个示例展示了两点:一个是依赖注入,另一个是基于抽象编程。我当时一直认为:只有在基于抽象编程的前提下,进行依赖注入才是有意义的。否则声明的是一个具体类,再注入一个具体类有什么意义呢?这是我三年前对IOC的认识。

    后来,我研究一个IOC框架PicoContainer:http://www.picocontainer.org/,这个IOC构架的参考文档让我对IOC有了更进一步的认识,也使我发现了我过去对IOC认识的一个局限。本质上讲,IOC之所以如此重要,是因为它解决了OO技术中一个重要的缺失:如何合理地创建对象并将它们关联起来协同工作。面向对象技术注重于对对象属性与行为的模拟,对这些对象从何而来,怎样相互依赖缺乏合理的模拟机制。很多时候,当一个对象A依赖到另一个对象B时,我们就new一个B的实例出来。这样做在有些时候是合理的,有些时候就是不恰当的。上面提及的基于抽象编程时就是一种情况。还有其他的情况。比如:A有没有创建B的责任?如果A没有创建B的责任,那么就不应该让A来承担。这是OO设计的一个重要原则:Designing Objects with Responsibilities。关于这一点,《Applying UML and Patterns, 3rd Edition》一书17.10节有详尽的说明。

   总之IOC就像一个系统的对象容器和粘合剂,它负责创建对象的实例,并按照它们声明的依赖关系把它们粘合起来共同工作。

本文转载自:http://blog.csdn.net/bluishglc/article/details/1680293

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力。然而,你一定曾为这些“高深术语”感到过困扰。也许时至今日,你仍对它们一知半解。不过就在今天...

wf王帆
2016/05/26
28
0
Spring-Spring相关术语-01

Spring-Spring相关术语-01 1.1 什么是Spring spring框架是分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。本质是一个容器。 l 分层:JavaEE分层来源JavaEE规范体系结果 l 一站式:spr...

守望者禾
2017/10/06
0
0
关于Laravel的核心分析

最近一段时间在研究laravel的底层源码,既然这样那得从开头说起,于是去了laravel学院看看别人写的关于laravel的核心分析,链接如下: Laravel 服务容器实例教程 —— 深入理解控制反转(IoC...

全栈coder
2017/03/10
0
0
Spring-Spring相关术语-01

Spring-Spring相关术语 1.1 Spring概述 spring框架是分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。本质是一个容器。 l 分层:JavaEE分层来源JavaEE规范体系结果 l 一站式:spring框架...

守望者禾
2017/10/06
0
0
spring的IOC和AOP详细讲解

1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同 时,要是产生的...

思维80
2016/04/07
219
2

没有更多内容

加载失败,请刷新页面

加载更多

通过ajax访问远程天气预报服务

http://www.webxml.com.cn/zh_cn/index.aspx 更改wsdl文件 打开文件将15行,51行,101行去掉 然后把文件复制到c盘 然后在桌面上面就生成了文件 将文件打成jar包 package cn.it.ws.weather;...

江戸川
21分钟前
1
0
聊聊storm的tickTuple

序 本文主要研究一下storm的tickTuple 实例 TickWordCountBolt public class TickWordCountBolt extends BaseBasicBolt { private static final Logger LOGGER = LoggerFactory.getLogg......

go4it
24分钟前
1
0
自动装箱和自动拆箱

自动装箱和自动拆箱 Java 提供了 8 种基本数据类型,每种数据类型都有其对应的包装类型,包装类是面向对象的类,是一种高级的数据类型,可以进行一些比较复杂的操作,它们是引用类型而不再基...

tsmyk0715
44分钟前
2
0
简易审计系统

1、有时候我们需要对线上用户的操作进行记录,可以进行追踪,出现问题追究责任,但是linux自带的history并不会实时的记录(仅仅在内存中,当用户正常退出(exit logout )时才会记录到history文件里...

芬野de博客
48分钟前
2
0
Qt那些事0.0.6

QML中使用Image,在设置source的后,通过Qt Quick2 Preview(qmlscene)遇到了图片找不到的问题: Image { id: success_img anchors.centerIn: parent ...

Ev4n
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部