觀察者模式之EventBus原始碼解析

2021-08-20 14:41:32 字數 2809 閱讀 3961

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用於獲取氣象站最...