IoC设计模式

<ol> <li>接口驱动 <p>要了解IoC设计模式,首先我们需要了解一下Interface Driven Design(即接口驱动),这也是我们现在常用的一种设计方式。 <p>接口驱动可灵活的提供不同子类的实现,增加代码的稳定性和可维护性尤其是代码的可扩展性。 <p>但在接口驱动中接口也是必须需要实现的,即类似于如下语句在代码中必须要执行。 <div class="csharpcode"> <div class="csharpcode"><pre class="alt">AInterface a = <span class="kwrd">new</span> AInterfaceImp();</pre></div> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

<style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

</div> <p>这样一来,耦合关系就产生了,如: </p><pre class="csharpcode"><span class="kwrd">class</span> A { <span class="kwrd">public</span>: AInterface a; A() {} aMethod() { a = <span class="kwrd">new</span> AInterfaceImp(); } };</pre> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

<style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

<p>class&nbsp; A与AInterfaceImp就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。 <p>通常我们可以建立一个Factory来根据条件生成想要的AInterface的实现,代码如下:<pre class="csharpcode"><span class="kwrd">class</span> InterfaceImplFactory { <span class="kwrd">public</span>: AInterface Create(Object condition) { <span class="kwrd">if</span>(condition = condA) { <span class="kwrd">return</span> <span class="kwrd">new</span> AInterfaceImpA(); } <span class="kwrd">else</span> <span class="kwrd">if</span>(condition = condB) { <span class="kwrd">return</span> <span class="kwrd">new</span> AInterfaceImpB(); } <span class="kwrd">else</span> { <span class="kwrd">return</span> <span class="kwrd">new</span> AInterfaceImp(); } } }</pre> <p>这种方式表面上在一定程度上缓解了以上问题,但实质上并没有改变代码的耦合。</p> <li>IoC设计模式 <p>IoC设计模式可以彻底解决这种耦合,它把耦合放到统一的XML 文件中,通过一个容器在需要的时候形成接口与实现的依赖关系,</p> <p>即把需要的接口实现注入到需要该实现的类中,这也许就是“依赖注入”说法的来源了。 </p> <p>整个系统中通过引入实现了IOC模式的IOC容器,该IOC容器可以管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的代码分开。</p> <p>用户可通过文本配置文件进行应用程序组件间相互关系的配置,而不用重新修改和编译代码。 </p> <p>当前比较知名的IOC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。 </p> <p>其中轻量级的有Pico Container、Avalon、Spring、HiveMind等,超重量级的有EJB,而半轻半重的有容器有JBoss,Jdon等。 </p> <p>我们可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中定义的,</p> <p>然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,</p> <p>改由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是为提高灵活性和可维护性。 <p>IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词,</p> <p>通俗的说反射就是根据给出的类名(字符串)来生成对象。这种方式可以让对象在生成时才决定要生成哪一种对象。</p> <p>反射的应用是很广泛的,象Hibernate、Spring中都是用“反射”做为最基本的技术手段。 </p> <li> <p>IoC实现策略</p> <p>IoC是一个很大的概念,可以用不同的方式实现。其主要形式有两种:</p> <p><b>依赖查找:</b></p> <p>容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。</p> <p>这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上。</p> <p>容器将调用这些回调方法,从而让应用代码获得相关资源。 <p><b>依赖注入:</b></p> <p>组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。</p> <p>容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。</p> <p>通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造子注入(Constructor Injection)</p></li></ol>

转载于:https://my.oschina.net/rookiedavin/blog/143518

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值