Android設計模式 觀察者模式

2021-08-11 22:12:37 字數 3555 閱讀 3184

觀察者模式是乙個使用頻率非常高的模式,他最常用的地方是gui系統和訂閱-發布系統。

該模式的最重要的作用就是解耦,使觀察者和被觀察者之間依賴盡可能小,甚至好無依賴。

定義物件間一種一對多的關係,使得每當乙個物件改版狀態,所有依賴它的物件都會得到通知並更新。

如圖:

1.事件多級觸發場景

2.關聯行為場景

3.跨系統的訊息交換場景,如:訊息佇列,事件匯流排的處理機制

舉幾個簡單的例子說明一下:

subject:抽象主題,把所有觀察者物件的引用保持再乙個集合,每個主題可以有多個觀察者(一對多)。

concretesubject:具體主題,在內部發生變化是後,通知所有註冊過的觀察者。

observer:抽象觀察者,定義了乙個更新介面,得到主題更改通知的時候更新自己。

concreteobserver:具體的觀察者,實現了抽象觀察者的更新介面,以便在主題狀態發生變化時候更新自身狀態。

我們假設開發一款新聞的軟體,每當有新的內容推出,那麼只要是訂閱了該新聞的使用者都可以接收到該新聞。

這種模式叫做發布–訂閱模式,也稱為觀察者模式。

首先我們需要完成被觀察者,這裡新聞**是被觀察物件。

/**

* created by doudou on 2017/12/5.

* * 新聞**----被觀察者

*/public class news extends observable

}

然後去完成觀察者:

/**

* created by doudou on 2017/12/5.

* * 訂閱新聞的使用者-----觀察者

*/public class user implements observer

@override

public void update(observable observable, object o)

}

接著我們就可以發布新聞啦!

news = new news();

//觀察者

user_one = new user("使用者一",this);

user_two = new user("使用者二",this);

user_three = new user("使用者三",this);

news.addobserver(user_one);

news.addobserver(user_two);

news.addobserver(user_three);

news.postnewpublication("重大新聞,新的一期android技術前線週報發布啦!!!");

observer和observable是jdk中的內建型別,可以看出觀察者模式的重要性。在這裡***observer***是***抽象的觀察者***,***user***是具體的觀察者;***observable***是抽象的主題,***news***是具體的主題。

當user訂閱了news之後,當news有更新,就會去遍歷所有觀察者(user),然後給每乙個觀察者更新資訊,即呼叫user的update()方法,這樣就完成了一對多的通知功能。

在這個過程中,完全依賴observer和observable,對於user和news完全沒有耦合,保證了訂閱的靈活性和可擴充套件性。

recycleview最重要的乙個功能就是adapter,當我們向recycleview中新增資料後,都會呼叫notifydatasetchanged()方法,這是為什麼呢,今天來一**竟。

我們先看adapter.notifydatasetchanged()函式

public class recyclerview extends viewgroup implements scrollingview, nestedscrollingchild 

//**省略

} //**省略

static class adapterdataobservable extends observable

/*** 資料集觀察者

*/public void notifychanged()

}//**省略

}}

從上面的**我們可以看出來,當我們呼叫adapter.notifydatasetchanged()時,實際在遍歷所有的觀察者,並呼叫他們的onchanged方法,從而告訴觀察者發生了變化。

那麼問題來了,這些觀察者從**來的?

其實這些觀察者是在setadapter時候產生的。我們看下相關**:

public class recyclerview extends viewgroup implements scrollingview, nestedscrollingchild 

private void setadapterinternal(adapter adapter, boolean compatiblewithprevious,

boolean removeandrecycleviews)

//**省略

madapterhelper.reset();

final adapter oldadapter = madapter;

madapter = adapter;

if (adapter != null)

//**省略

} //**省略

private class recyclerviewdataobserver extends adapterdataobserver else

if (!madapterhelper.haspendingupdates())

}//**省略

} //**省略

}

到這裡我們知道,當recycleview資料發生變化時,呼叫adapternotifydatasetchanged函式,該函式會呼叫adapterdataobservablenotifychanged函式,這個函式會呼叫所有觀察者(recyclerviewdataobserver)的onchanged方法,然後所有觀察者會重新繪製布局。

這就是乙個觀察者模式。

Android 觀察者設計模式

觀察者模式 observer 是軟體設計模式的一種,定義了物件之間一種一對多的關係,也 就是當乙個物件資料發生變化時,會通知與之依賴的其他物件,以相應其資料變化,這種當 目標物件資料發生變化時,與之對應的觀察者物件資料隨之發生變化的,具有一對多通知關 系的設計模式叫做觀察者設計模式.觀察者設計模式中...

Android設計模式 觀察者模式

觀察者模式又叫訂閱 發布模式,它的主要作用就是解耦,將觀察者和被觀察者解耦,使它們的依賴性變的更小。在這個模式中主要就是被觀察者通知所有觀察者發生改變,及時的更新。listview的notifydatasetchanged 改變介面 broadcastrecevier也是運用此設計模式。角色介紹 s...

python 設計模式 觀察者 觀察者設計模式

在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...