Inversion of Control(IoC)控制反转

先概括一下Inversion of Control控制反转:是一种设计模式,在依赖关系上进行倒转。具体的体现有“应用程序不应依赖于容器,而是容器服务于应用程序”。

 

根据Martin Fowler的理解,IoC其实就是框架(framework)和库(library)的区别。库实际意义上就是一系列可用的方法函数,而框架则定义了一些设计模式,比如有如下的ruby代码

  #ruby
  puts 'What is your name?'
  name = gets
  process_name(name)
  puts 'What is your quest?'
  quest = gets
  process_quest(quest)

在这里,控制是在这段主程序代码里面进行的(程序员的这段程序拥有代码的控制权),什么时候问问题,什么时候输入,都是由程序员写的这段程序来决定的。而看下面一段代码

  require 'tk'
  root = TkRoot.new()
  name_label = TkLabel.new() {text "What is Your Name?"}
  name_label.pack
  name = TkEntry.new(root).pack
  name.bind("FocusOut") {process_name(name)}
  quest_label = TkLabel.new() {text "What is Your Quest?"}
  quest_label.pack
  quest = TkEntry.new(root).pack
  quest.bind("FocusOut") {process_quest(quest)}
  Tk.mainloop()

这里,框架提供了bind的接口,让程序员把方法调用传给框架,而具体何时调用,是由框架来通知程序的。这样一来,其实就是对于程序控制的反转。

在其他例子里面,比如C#的按钮,可以让程序员注册回调函数监听事件,在触发事件(比如按钮被点击)的时候,被注册的回调函数就会被调用,在这个意义理解,程序代码从“主动”变成了“被动”。这种IoC的特性,其实也是框架提供的设计模式。

 

Martin Fowler关于IoC的文章:

http://martinfowler.com/bliki/InversionOfControl.html

你可能感兴趣的:(C#)