Martin Fowler的经典文章 + 透明的精彩翻译 + 1-2-3的UML插图(这个就不足挂齿了,呵呵)。
原文下载
《IoC 容器和Dependency Injection 模式》Martin Fowler 著,透明 译,PDF格式。
英文好的朋友也可以看原文 Inversion of Control Containers and the Dependency Injection pattern。
UML插图
我为构造子注入、设置值注入、接口注入以及Service Locator分别绘制了UML图,本想直接插入到PDF文件中,但是觉得这样会影响原文质量,三思之后还是决定就把图贴在Blog里好了。
使用 PicoContainer 进行构造子注入(Page 5)
图中黄颜色的类是Fowler写的组件,他的朋友不能更改;绿颜色的类可由他的朋友新增/修改。
MovieLister和MovieFinder类层次构成了Strategy模式。MovieLister符合针对接口编程的设计原则。还有一个非常好的地方是Client类 MovieListerTester也不依赖于实现类(例如 ColonMovieFinder)。对实现类的依赖被封装在了一个函数configureContainer()中。
![](https://i-blog.csdnimg.cn/blog_migrate/1326956381dec9f9b17f0c0269529445.png)
使用Spring 进行设值方法注入(Page 6)
图中黄颜色的类是Fowler写的组件,他的朋友不能更改;绿颜色的类可由他的朋友新增/修改。
MovieLister和MovieFinder类层次构成了Strategy模式。MovieLister符合针对接口编程的设计原则。还有一个非常好的地方是Client类 MovieListerTester也不依赖于实现类(例如 ColonMovieFinder)。对实现类的依赖被封装在了一个叫作“spring.xml”的文件中。
![](https://i-blog.csdnimg.cn/blog_migrate/3db59f082ceca368eb4535e9a4875209.png)
接口注入(Page 7)
图中黄颜色的类是Fowler写的组件,他的朋友不能更改;绿颜色的类可由他的朋友新增/修改。
MovieLister和MovieFinder类层次构成了Strategy模式。MovieLister符合针对接口编程的设计原则。
注意虽然在IfaceTester#configureLister()函数内创建了ColonMovieFinder的实例,但是由于只使用了它所实现的窄接口InjectFilename的injectFileName()函数,所以仍有使IfaceTester只依赖于InjectFilename接口的潜力。
![](https://i-blog.csdnimg.cn/blog_migrate/ccb61e306aa4264cb55259901ec97f2a.png)
使用Service Locator(Page 8)
![](https://i-blog.csdnimg.cn/blog_migrate/3c440185d646dd4c5d633076b148b7b0.png)
时序图
![](https://i-blog.csdnimg.cn/blog_migrate/4356731014af709f2c2b5f858bc9c834.png)
工具箱
UML图使用 Visio 2003+ Pavel Hruby's UML2.0 模板绘制。文字部分使用 Google 拼音输入法键入。