代碼的世界其實和生活息息相關
什么是觀察者?我覺得很多技術文章 大家可能看的比較抽象 我們就用生活中的例子來介紹下吧
就拿我們去買衣服來說吧,咱們都喜歡去逛街對不對,-,-可能因為我是一個女程式員的原因哈
現在XX店鋪降價 打折我們是不知道的 毫無任何關聯
那么此種情況下,店員會說,你加我們微信或者關注我們公眾號,如果這款有打折活動,我們就會通知到你 是不是這么一個情況?
畫成示意圖就是這樣的

嗯,那么店鋪肯定不止和一個客戶這么說了,凡是來店里的客戶,都會讓他們去訂閱他們的訊息
等到降價的活動一下發,客戶們就會收到通知 進行對應的動作
最貼近最貼近的應該就是我們生活中用的鬧鐘吧,手機上的鬧鐘及備忘錄,時間到了,就會對你進行提醒,其實這也是我們訂閱了時間
好,我們來舉例一個我們開發中應用的那么一個場景
在幾年前我們組在做tvstore時做過這么一個需求,首先進入TVstore 對應APP 比如叫 王者榮耀吧 我們再假設這個王者榮耀需要花10塊錢購買 ,界面我就簡單畫下哈 玩過電視應用的小伙伴應該都看過這樣的頁面的

點擊那個10元的按鈕會跳轉支付頁面進行支付

大家不要掃哈,好,支付完成后-會出現 5 4 3 2 1秒支付成功的倒計時,其實這個時間就是給支付的SDK去處理拿到成功回呼的時間 發現成功以后,回傳到詳情界面 會進行界面的重繪,
但是 自測發現
有時候測驗不會等待倒計時 就直接回傳上一個界面 而此時 其實支付成功的回呼才回應,那么我們怎么辦呢? 我就用了觀察者模式來解決這個問題
讓我們用一個Demo去模擬 大家就能明白了
先定義一個觀察者的介面
public interface PayObserver {
void updateView(); //更新頁面
}
以上就是觀察者如果發現有回應以后,需要做什么
接下來讓我們定義一個抽象的PaySubject 用于讓各個觀察者進行訂閱,如增加觀察者,remove觀察者
還有具體的抽象方法,我們用來模擬SDK掃碼的一個程序
abstract class PaySubject {
protected List<PayObserver> observers = new ArrayList<PayObserver>();
//增加觀察者方法
public void addNotifyPage(PayObserver observer) {
observers.add(observer);
}
//洗掉觀察者方法
public void removeNotifyPage(PayObserver observer) {
observers.remove(observer);
}
public abstract void notifyObserver();
}
接下來就是真正的去模擬場景, 5 4 3 2 1支付完成進入倒計時,開始通知各個界面進行重繪
public class PayTestSuject extends PaySubject {
@Override
public void notifyObserver() {
try {
for (int i = 5; i > 0; i--) {
Thread.sleep(1000);
System.out.println("倒計時:" + i + "s");
}
Thread.sleep(1000);
System.out.println("倒計時結束!");
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("支付完成開始通知其他UI界面更新啦...");
for (Object obs : observers) {
((PayObserver) obs).updateView();
}
}
}
那么各個界面收到通知,會進行界面重繪
Activity1Observer Activity2Observer 分別模擬真實場景下收到訂閱訊息后的頁面重繪
public class Activity1Observer implements PayObserver{
@Override
public void updateView() {
System.out.println("Activity1Observer 收到通知 準備更新界面啦");
}
}
public class Activity2Observer implements PayObserver{
@Override
public void updateView() {
System.out.println("Activity2Observer 收到通知 準備更新界面啦");
}
}
讓我們來模擬一把
public class ObserverDemo {
public static void main(String[] args) {
PaySubject paySubject = new PayTestSuject();
PayObserver observer2 = new Activity2Observer();
paySubject.addNotifyPage(observer2);
PayObserver observer1 = new Activity2Observer();
paySubject.addNotifyPage(observer1);
paySubject.notifyObserver();
}
}
看看結果是什么樣子的?

其實安卓中很多地方都用到了觀察者,其中一個經典的使用到觀察者模式的就是Android控制元件的事件監聽模型
喜歡這一塊的并且想了解的朋友們可以在后面的我的關于Android原始碼里 觀察者相關的 在另一篇進行介紹,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345802.html
標籤:其他
上一篇:Vue全部知識點整理
