觀察者模式又叫訂閱—發布模式,它的主要作用就是解耦,將觀察者和被觀察者解耦,使它們的依賴性變的更小。在這個模式中主要就是被觀察者通知所有觀察者發生改變,及時的更新。listview的notifydatasetchanged()改變介面、broadcastrecevier也是運用此設計模式。
角色介紹
subject:抽象主題,被觀察者(observable)的角色,抽象主題角色把所有觀察者物件的引用儲存在乙個集合裡,每個主題都可以有任意數量的觀擦者,抽象主題提供乙個介面,可以增加、刪除觀察者物件。
concretesubject:具體主題,該角色將有關狀態存入具體觀察者物件,在具體主題的內部狀態發生改變時,給所有註冊過的觀察者發出通知,具體主題角色又叫具體被觀察者(concreteobservable)角色。
observer:抽象觀察者,該角色是觀察者的抽象類,它定義了乙個更新介面,使得在得到主題的更改通知時更新自己。
concreteobservre:具體的觀察者,該角色實現抽象觀察者所定義的更新介面,以便在主題的轉態發生變化時更新自己的狀態。
下面我們來實現乙個例子
抽象觀察者
當被觀察者發生變化時,觀察者進行的行為動作,提供乙個統一的方法名便於被呼叫,引數自己定義
/**
* created by fhm on 2017/5/4.
* 觀察者的介面
*/public
inte***ce
observer
具體的觀察者
/****
* ** ***/
public
class
obseractivity
extends
implements
observer
public
void
initreceiver()
@override
public
void
action(context context, object... objects)
@override
protected
void
ondestroy()
}
抽象的被觀察者
/**
* created by fhm on 2017/5/3.
* 被觀察者物件
* * @param
*/public abstract
class
observable
/**
* 登出觀察者
** @param t
*/public void unrristerobserver(t t)
/*** 判斷所傳的觀察者是否為空
*/private void checknull(t t)
}/***
* 通知觀察者做出行為改變
***/
public abstract void notifyobservers(object... objects);
}
具體的被觀察者
/**
* created by fhm on 2017/5/4.
* 被觀察者物件
*/public class
alarmobservable
extends
observable
public static alarmobservable getinstance(context mcontext)
return malarmobservable;
}@override
public void notifyobservers(object... objects) }}
}
提醒觀察者更新
public
class
observableactivity
extends
activity
}
一步一步的,觀察者模式大致就是這個樣子,需要自己好好去理解這個思想。
但是,到真正專案的使用的時候,建議使用別人開發的輪子。例如:eventbus和otto。
有興趣的可以看看eventbus的使用。
eventbus使用詳解(一)——初步使用eventbus
Android 觀察者設計模式
觀察者模式 observer 是軟體設計模式的一種,定義了物件之間一種一對多的關係,也 就是當乙個物件資料發生變化時,會通知與之依賴的其他物件,以相應其資料變化,這種當 目標物件資料發生變化時,與之對應的觀察者物件資料隨之發生變化的,具有一對多通知關 系的設計模式叫做觀察者設計模式.觀察者設計模式中...
Android設計模式 觀察者模式
觀察者模式是乙個使用頻率非常高的模式,他最常用的地方是gui系統和訂閱 發布系統。該模式的最重要的作用就是解耦,使觀察者和被觀察者之間依賴盡可能小,甚至好無依賴。定義物件間一種一對多的關係,使得每當乙個物件改版狀態,所有依賴它的物件都會得到通知並更新。如圖 1.事件多級觸發場景 2.關聯行為場景 3...
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...