觀察者模式面向的需求是:A 對象(觀察者)對 B 對象(被觀察者)的某種變化高度敏感,須要在 B 變化的一瞬間作出反應。舉個例子,新聞裏喜聞樂見的警察抓小偷,警察須要在小偷伸手做案的時候實施抓捕。在這個例子裏,警察是觀察者,小偷是被觀察者,警察須要時刻盯着小偷的一舉一動,才能保證不會漏過任何瞬間。程序的觀察者模式和這種真正的『觀察』略有不一樣,觀察者不須要時刻盯着被觀察者(例如 A 不須要每過 2ms 就檢查一次 B 的狀態),而是採用註冊(Register)或者稱爲訂閱(Subscribe)的方式,告訴被觀察者:我須要你的某某狀態,你要在它變化的時候通知我。 Android 開發中一個比較典型的例子是點擊監聽器 OnClickListener
。對設置OnClickListener
來講, View
是被觀察者, OnClickListener
是觀察者,兩者經過 setOnClickListener()
方法達成訂閱關係。訂閱以後用戶點擊按鈕的瞬間,Android Framework 就會將點擊事件發送給已經註冊的 OnClickListener
。採起這樣被動的觀察方式,既省去了反覆檢索狀態的資源消耗,也可以獲得最高的反饋速度。固然,這也得益於咱們能夠隨意定製本身程序中的觀察者和被觀察者,而警察叔叔明顯沒法要求小偷『你在做案的時候務必通知我』。code