觀察者模式在android中使用

觀察者模式(Observer)

觀察者模式是對象的行為模式,又被叫做為模型-視圖模式。這種模式定義瞭一種一對多的依賴關系,使多個觀察者對象同時監聽某個角色對象。一旦這個角色對象的狀態發生瞭變化,就會通知所有觀察者對象,使它們能夠自動更新自己本身。

下面來看下觀察者模式的結構,具體如下:

 

從上面圖中可以看出,觀察者模式涉及瞭四個角色,具體如下所示:

A、抽象實體角色:這個角色為抽象角色,它把所有的對觀察者對象的引用都保存在一個聚集中,每個主題對象都可以有若幹個觀察者對象,主題角色又叫做抽象被觀察者對象,一般用抽象類或接口表示。

同時,這個角色中含有瞭對觀察者具體的管理方法及當主題角色發生改變時通知所有觀察者對象。

B、具體實體角色:這個角色為具體實現瞭抽象的實體角色的具體角色。它含有瞭一個對實體角色狀態的引用,一但實體角色改變,那麼就會調用通知方法通知所有觀察者對象。

C、抽象觀察者對象:這個角色為所有的具體的觀察者對象提供通用的接口,在得到實體變化的通知時實時的更新自己,這個角色一般用抽象類和接口來實現。

D、具體觀察者對象:將有關的狀態放到具體觀察者對象中,在具體主題的內部的狀態改變時,給所有的觀察者發送通知。該角色又叫做為具體被觀察者角色。

下面具體舉例來說明觀察者模式的使用。例子是這樣的:用戶現在要購買若幹件同一品牌的不同款式的衣服,假如用戶已經選好瞭不同款式的衣服,現需要實現添加到購物車並支付;支付成功之後,現在需要及時刷新用戶的購物車,以便用戶可以及時知道自己支付的結果,方便從新支付或挑選其他款式並支付。好瞭,具體需要描述完瞭,接下來請看功能詳細類圖說明:

 

下面直接看代碼吧!我會在下面列出觀察者模式的核心代碼,其他請參看我上傳的項目代碼包,具體如下:

抽象實體角色(Cart):

/**

* @description :

* 抽象實體角色-觀察者關註的對象實體

*/

public abstract class Cart {

private Vector observers = new Vector();

 

public Cart() {

super();

}

 

/**

* @description :

* 登記一個觀察者對象

*/

public voidattach(SalesObserver observer) {

observers.addElement(observer);

}

 

/**

* @description :

* 刪除一個已經登記的觀察者對象

*/

public voiddetach(SalesObserver observer) {

observers.removeElement(observer);

}

 

public void detach(int index) {

observers.remove(index);

}

 

/**

* @description :

* 通知所有已經登記過的觀察者對象

*/

public void notifyAllBills(){

Enumerationenumes = observers();

while(enumes.hasMoreElements()){

SalesObserverobj = (SalesObserver)enumes.nextElement();

obj.updateSale(obj);

}

}

 

/**

* @description :

* 支付成功之後,更新購物車內的所有商品的支付狀態

* 註意:這裡更新的是本地緩存數據(不通過接口更新)

*/

public booleanbillsPay() {

boolean payStatus = true;

// 異步網絡支付

// TODO

 

// 這裡模擬支付成功

if(payStatus) {

// 更新本地緩存數據

updateLocalCache();

}

 

return true;

}

 

/**

* @description :

* 更新緩存

*/

private voidupdateLocalCache() {

for(SalesObserver obs : observers) {

Salesale = obs.getSale();

sale.setPayStatus(支付完成);

}

}

 

public Enumerationobservers() {

return observers.elements();

}

}

 

具體實體角色(ShoppingCart):

/**

* @description :

* 具體的實體角色-具體通知各個觀察者對象更新狀態

*/

public class ShoppingCart extends Cart {

 

public ShoppingCart() {

super();

}

 

protected void billPayResult(boolean flag) {

if(!flag) {

// 支付失敗提示(這裡不考慮這種情況)

return;

}

 

// notify obervers

notifyAllBills();

}

}

 

抽象觀察者角色(Observer):

/**

* @description :

* 抽象觀察者-為所有具體觀察者提供更新方法

*/

public interface Observer{

 

public Object updateSale(Object obj);

 

}

 

具體觀察者角色(SalesObserver):

/**

* @description :

* 具體觀察者-具體執行更改狀態的操作

*/

public class SalesObserver implements Observer {

private Sale sale = null;

 

public SalesObserver(Sale sale) {

this.sale = sale;

}

 

@Override

public Object updateSale(Object obj) {

this.sale = (Sale) obj;

return sale;

}

 

public Sale getSale() {

return sale;

}

 

public void setSale(Sale sale) {

this.sale = sale;

}

}

 

好瞭,核心的代碼已經貼上瞭,下面會列出整個流程的演示效果圖:

添加購物車:

 

移除購物車:

 

支付之後效果(之前購物車和移除購物車效果相同略):

 

 

 

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。