观察者模式面向的需求是:A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,须要在 B 变化的一瞬间作出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察须要在小偷伸手做案的时候实施抓捕。在这个例子里,警察是观察者,小偷是被观察者,警察须要时刻盯着小偷的一举一动,才能保证不会漏过任何瞬间。程序的观察者模式和这种真正的『观察』略有不一样,观察者不须要时刻盯着被观察者(例如 A 不须要每过 2ms 就检查一次 B 的状态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我须要你的某某状态,你要在它变化的时候通知我。 Android 开发中一个比较典型的例子是点击监听器 OnClickListener
。对设置OnClickListener
来讲, View
是被观察者, OnClickListener
是观察者,两者经过 setOnClickListener()
方法达成订阅关系。订阅以后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的 OnClickListener
。采起这样被动的观察方式,既省去了反复检索状态的资源消耗,也可以获得最高的反馈速度。固然,这也得益于咱们能够随意定制本身程序中的观察者和被观察者,而警察叔叔明显没法要求小偷『你在做案的时候务必通知我』。code