標籤:設計模式
觀察者模式(Observer)
觀察者模式是對象的行為模式,又被叫做為模型-視圖模式。這種模式定義了一種一對多的依賴關係,使多個觀察者對象同時監聽某個角色對象。一旦這個角色對象的狀態發生了變化,就會通知所有觀察者對象,使它們能夠自動更新自己本身。
下面來看下觀察者模式的結構,具體如下:
從上面圖中可以看出,觀察者模式涉及了四個角色,具體如下所示:
A、抽象實體角色:這個角色為抽象角色,它把所有的對觀察者對象的引用都儲存在一個聚集中,每個主題對象都可以有若干個觀察者對象,主題角色又叫做抽象被觀察者對象,一般用抽象類別或介面表示。
同時,這個角色中含有了對觀察者具體的管理方法及當主題角色發生改變時通知所有觀察者對象。
B、具體實體角色:這個角色為具體實現了抽象的實體角色的具體角色。它含有了一個對實體角色狀態的引用,一但實體角色改變,那麼就會調用通知方法通知所有觀察者對象。
C、抽象觀察者對象:這個角色為所有的具體的觀察者對象提供通用的介面,在得到實體變化的通知時即時的更新自己,這個角色一般用抽象類別和介面來實現。
D、具體觀察者對象:將有關的狀態放到具體觀察者對象中,在具體主題的內部的狀態改變時,給所有的觀察者發送通知。該角色又叫做為具體被觀察者角色。
下面具體舉例來說明觀察者模式的使用。例子是這樣的:使用者現在要購買若干件同一品牌的不同款式的衣服,假如使用者已經選好了不同款式的衣服,現需要實現添加到購物車並支付;支付成功之後,現在需要及時重新整理使用者的購物車,以便使用者可以及時知道自己支付的結果,方便從新支付或挑選其他款式並支付。好了,具體需要描述完了,接下來請看功能詳細類圖說明:
下面直接看代碼吧!我會在下面列出觀察者模式的核心代碼,其他請參看我上傳的項目程式碼封裝,具體如下:
抽象實體角色(Cart):
/**
* @description :
* 抽象實體角色-觀察者關注的對象實體
*/
public abstract class Cart {
private Vector<SalesObserver>observers = new Vector<SalesObserver>();
public Cart() {
super();
}
/**
* @description :
* 登記一個觀察者對象
*/
public voidattach(SalesObserver observer) {
observers.addElement(observer);
}
/**
* @description :
* 刪除一個已經登記的觀察者對象
*/
public voiddetach(SalesObserver observer) {
observers.removeElement(observer);
}
public void detach(intindex) {
observers.remove(index);
}
/**
* @description :
* 通知所有已經登記過的觀察者對象
*/
public void notifyAllBills(){
Enumeration<?>enumes = observers();
while(enumes.hasMoreElements()){
SalesObserverobj = (SalesObserver)enumes.nextElement();
obj.updateSale(obj);
}
}
/**
* @description :
* 支付成功之後,更新購物車內的所有商品的支付狀態
* 注意:這裡更新的是本機快取資料(不通過介面更新)
*/
public booleanbillsPay() {
booleanpayStatus = true;
// 非同步網路支付
// TODO
// 這裡類比支付成功
if(payStatus) {
// 更新本機快取資料
updateLocalCache();
}
return true;
}
/**
* @description :
* 更新緩衝
*/
private voidupdateLocalCache() {
for(SalesObserverobs : observers) {
Salesale = obs.getSale();
sale.setPayStatus("支付完成");
}
}
public Enumeration<?> observers() {
return observers.elements();
}
}
具體實體角色(ShoppingCart):
/**
* @description :
* 具體的實體角色-具體通知各個觀察者對象更新狀態
*/
public class ShoppingCart extends Cart {
public ShoppingCart() {
super();
}
protected void billPayResult(booleanflag) {
if(!flag) {
// 支付失敗提示(這裡不考慮這種情況)
return;
}
// notify obervers
notifyAllBills();
}
}
抽象觀察者角色(Observer):
/**
* @description :
* 抽象觀察者-為所有具體觀察者提供更新方法
*/
public interface Observer{
public Object updateSale(Objectobj);
}
具體觀察者角色(SalesObserver):
/**
* @description :
* 具體觀察者-具體執行更改狀態的操作
*/
public class SalesObserver implements Observer {
private Salesale = null;
public SalesObserver(Salesale) {
this.sale =sale;
}
@Override
public Object updateSale(Objectobj) {
this.sale = (Sale)obj;
return sale;
}
public Sale getSale() {
return sale;
}
public void setSale(Sale sale) {
this.sale =sale;
}
}
好了,核心的代碼已經貼上了,下面會列出整個流程的示範:
添加購物車:
移除購物車:
支付之後效果(之前購物車和移除購物車效果相同略):
好了,到這裡觀察者模式已經介紹完了,希望對你有協助,另外,原創作品來之不易,轉載請註明謝謝。
點擊我下載代碼!
技術交流群:179914858
觀察者模式在android中使用