1、觀察者模式概述:
觀察者模式(observer pattern):定義物件之間的一種一對多依賴關係,使得每當乙個物件狀態發生改變時,其相關依賴物件皆得到通知並自動更新。觀察者模式的別名包括發布-訂閱(publish/subscribe)模式、模型-檢視(model/view)模式。觀察者模式是一種物件行為型模式《設計模式的藝術》使用場景:
觀察者模式是使用頻率最高的設計模式之一,主要用於建立物件之間的一種一對多的依賴關係。通過發布訂閱的方式,實現物件之間的解耦合。主要用於當乙個物件狀態改變時,另外乙個物件會隨之變化的場景。乙個目標可以對於多個觀察者,各個觀察者之間互不聯絡,只關注目標狀態的改變。
2、**模式uml類圖:
subject(抽象目標類):目標又稱之為主題,它是指被觀察的物件。在抽象目標類中會定義乙個抽象觀察者的集合,並定義增加和刪除、通知觀察者的相關介面。
concretesubject(具體目標):作為抽象目標類的子類,實現抽象目標類定義的介面。當具體目標狀態發生變化時,通過觀察者。
observer(抽象觀察者):所謂所有觀察者的公共父類,定義觀察者的共同行為介面。
concreteobserver(具體觀察者):作為抽象觀察者的子類,實現相關介面,當收到具體目標狀態改變的通知,執行具體業務邏輯。
3、eventbus原始碼分析:
eventbus是android平台下用於應用內各元件或者模組間通訊的乙個類庫,其主要實現思想為觀察者模式。
//以下**為觀察者註冊和監聽的相關**
class
testactivity: activity()
override fun ondestroy()
//接收通知方法
@subscribe(threadmode = threadmode.main)
fun receiveevent(message: string?)
}class
mainactivity : baseactivity()
}
//eventbus原始碼,觀察者註冊過程
public
void
register(object subscriber) }}
listfindsubscribermethods(class> subscriberclass)
if (ignoregeneratedindex) else
if (subscribermethods.isempty()) else
}//下述subscribribe方法才是真正的註冊觀察者方法
// must be called in synchronized block
private
void
subscribe(object subscriber, subscribermethod subscribermethod) else
}int size = subscriptions.size();
for (int i = 0; i <= size; i++)
}list> subscribedevents = typesbysubscriber.get(subscriber);
if (subscribedevents == null)
subscribedevents.add(eventtype);
if (subscribermethod.sticky)
}} else }}
/** posts the given event to the event bus. */
public
void
post(object event)
try
} finally }}
private
void
postsingleevent(object event, postingthreadstate postingstate) throws error
} else
if (!subscriptionfound)
if (sendnosubscriberevent && eventclass != nosubscriberevent.class &&
eventclass != subscriberexceptionevent.class) }}
//最終呼叫的方法
void invokesubscriber(subscription subscription, object event) catch (invocationtargetexception e) catch (illegalacces***ception e)
}
eventbus的設計充分體現觀察者模式的思想,訊息發布者與訂閱者之間充分解耦合。介面實現靈活度高,eventbus類作為整個庫的核心,完成訂閱與發布的功能,使得目標與觀察者能夠很好的通訊。此外,觀察者模式應用於mvc架構上,實現表示出與資料邏輯層的分離。
4、優缺點分析:
優點:1)在觀察者和目標之間解耦合;
2)支援廣播通訊,簡化一對多系統設計;
3)符合開閉原則,擴充套件性好;
缺點:1)目標狀態改變時,會將變化通知到所有觀察者,時間消耗較大;
結束語觀察者模式作為一種很常用和實用的設計模式,常在廣播實現、mvc等架構上應用。對於降低系統耦合下,提高系統的擴充套件性很有用。一對多關係的模型較適合使用。
觀察者模式和EventBus
在熟悉一些專案的時候,發現專案中的一些設計模式,之後會慢慢寫。這裡就寫專案中的觀察者的使用。觀察者模式在被觀察者和觀察者之間建立乙個抽象的耦合。被觀察者角色所知道的只是乙個具體觀察者列表,每乙個具體觀察者都符合乙個抽象觀察者的介面。被觀察者並不認識任何乙個具體觀察者,它只知道它們都有乙個共同的介面。...
c 之觀察者模式
以下均摘自 大話設計模式 這本書,供大家一起學習和交流,感謝作者。觀察者模式又叫做發布 訂閱模式 其定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。觀察者模式結構圖 subject類,可翻譯為主題或者抽象統...
HEAD FIRST 之觀察者模式
定義了物件之間的一對多依賴,當乙個物件改變狀態時,它的所有依賴者都將會收到通知並自動更新.觀察者模式形容圖 有乙個氣象觀察站,我們希望建立乙個應用,有三種佈告板 用於顯示不同的氣象資料 當氣象站獲取到最新的測量資料時,我們希望三種佈告板能實時更新.類圖設計 其中weatherdata用於獲取氣象站最...