觀察者模式是乙個使用頻率非常高的模式,他最常用的地方是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
資料發生變化時,呼叫adapter
的notifydatasetchanged
函式,該函式會呼叫adapterdataobservable
的notifychanged
函式,這個函式會呼叫所有觀察者(recyclerviewdataobserver)的onchanged
方法,然後所有觀察者會重新繪製布局。
這就是乙個觀察者模式。
Android 觀察者設計模式
觀察者模式 observer 是軟體設計模式的一種,定義了物件之間一種一對多的關係,也 就是當乙個物件資料發生變化時,會通知與之依賴的其他物件,以相應其資料變化,這種當 目標物件資料發生變化時,與之對應的觀察者物件資料隨之發生變化的,具有一對多通知關 系的設計模式叫做觀察者設計模式.觀察者設計模式中...
Android設計模式 觀察者模式
觀察者模式又叫訂閱 發布模式,它的主要作用就是解耦,將觀察者和被觀察者解耦,使它們的依賴性變的更小。在這個模式中主要就是被觀察者通知所有觀察者發生改變,及時的更新。listview的notifydatasetchanged 改變介面 broadcastrecevier也是運用此設計模式。角色介紹 s...
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...