看类图关系,一个MovieList类引用一个IMoveFinder对象,ImoveFinder有一个FindAll()的方法,此例中由SimpleMovieFinder 实现。实际上就是由SimpleMovieFinder 实现ImoveFinder接口,而MovieLister只知道ImoveFinder接口,是运行时动态确定ImoveFinder究竟是怎么实现的。
几本思想就是:多态 + 面向接口编程
在Spring .Net中是用 Injection 的方式实现的。把 MovieList看作一个容器,在Config中声明。
<objects xmlns="http://www.springframework.net">
<object name="MyMovieLister"
type="Spring.Examples.MovieFinder.MovieLister, Spring.Examples.MovieFinder">
</object>
</objects>
type="Spring.Examples.MovieFinder.MovieLister, Spring.Examples.MovieFinder">
</object>
</objects>
把SimpleMovieFinder作为Inject(注入)MovieList的对象。也在Config中声明
<object name="MyMovieFinder"
type="Spring.Examples.MovieFinder.SimpleMovieFinder, Spring.Examples.MovieFinder"/>
type="Spring.Examples.MovieFinder.SimpleMovieFinder, Spring.Examples.MovieFinder"/>
</object>
把两个对象关联起来,在Config中完整的配置如下
<objects xmlns="http://www.springframework.net">
<object name="MyMovieLister"
type="Spring.Examples.MovieFinder.MovieLister, Spring.Examples.MovieFinder">
<!-- using setter injection... -->
<property name="movieFinder" ref="MyMovieFinder"/>
</object>
<object name="MyMovieFinder"
type="Spring.Examples.MovieFinder.SimpleMovieFinder, Spring.Examples.MovieFinder"/>
</object>
<object name="MyMovieLister"
type="Spring.Examples.MovieFinder.MovieLister, Spring.Examples.MovieFinder">
<!-- using setter injection... -->
<property name="movieFinder" ref="MyMovieFinder"/>
</object>
<object name="MyMovieFinder"
type="Spring.Examples.MovieFinder.SimpleMovieFinder, Spring.Examples.MovieFinder"/>
</object>
</objects>
<property name="movieFinder" ref="MyMovieFinder"/>
是根据 MovieLister的属性来配置的
private IMovieFinder _movieFinder;
public IMovieFinder MovieFinder
{
get
{
return _movieFinder;
}
set
{
_movieFinder = value;
}
}
MovieLister 中IMovieFinder 的一个引用,需要做的就是把一个IMovieFinder 的实现注入给它,就是用注入的对象实例化这个接口。
有人可能问了:这个用代码的方式也很容易实现,为啥要用配置的方式呢?我也刚看了一小会,知道究竟怎么个回事了再说!
或者哪位大师知道用配置方式实现的好处,可以先透露一下!!