觀察者模式----在RecycleView中使用

參考文檔:

http://www.lxweimin.com/p/d55ee6e83d66
文章中的例子來源于參考文獻(xiàn),更詳細(xì)的講解在參考文章中,本文是自己的一個理解

觀察者模式使用場景:

A對象(觀察者)對B對象(被觀察者)的某種變化高度敏感,需要在B變化的一瞬間做出反應(yīng)。在代碼上實現(xiàn)上,通常是被觀察者主動去注冊或者訂閱一個觀察者,

構(gòu)建觀察者模式

1.被觀察者持有觀察者對象,這一步驟通常是通過被觀察者注冊(Register方法)或者訂閱(Subscribe方法)觀察者實現(xiàn)的。
2.觀察者同樣持有被觀察者對象,同時調(diào)用被觀察者的訂閱方法完成訂閱。(被觀察者拿到觀察者對象這一步通常在觀察者類中去做。)
3.被觀察者具有一個"通知觀察者的"方法,該方法通過調(diào)用被觀察者內(nèi)部持有的觀察者對象的方法來達(dá)到通知觀察者的目的。
(其實所謂收到通知就是被觀察者做某些操作時,同時調(diào)用了觀察者的特定方法。)

Paste_Image.png
Paste_Image.png
Paste_Image.png
實現(xiàn)過程

被觀察者接口

/** * 主題(發(fā)布者、被觀察者) */
public interface Subject { 
/** * 注冊觀察者 */
 void registerObserver(Observer observer);
 /** * 移除觀察者 */ 
void removeObserver(Observer observer);
 /** * 通知觀察者 */ 
void notifyObservers(); }

觀察者接口

/** * 觀察者 */
public interface Observer { 
void update();
}

具體實現(xiàn)
被觀察者:
1.被觀察者持有觀察者對象。
2.被觀察者持有的觀察者對象通過訂閱(注冊方法拿到)
3.被觀察者數(shù)據(jù)改變的時候通知觀察者(通過調(diào)用觀察者的update方法)

public class WeatherData implements Subject { 

private List<Observer> observers;//1.被觀察者持有觀察者對象。

private float temperature;
private float humidity;
private float pressure;
private List<Float> forecastTemperatures;
 //未來幾天的溫度
 public WeatherData() { this.observers = new ArrayList<Observer>(); 

 //被觀察者持有的觀察者對象通過訂閱
 @Override
 public void registerObserver(Observer observer) { this.observers.add(observer); } 

 @Override 
 public void removeObserver(Observer observer) { 
   this.observers.remove(observer); 
 } 
通知觀察者
@Override 
public void notifyObservers() { 
   for (Observer observer : observers) { 
     observer.update();
   } 
}

在數(shù)據(jù)更新的時候通知觀察者
  public void changeWeatherData(float temperature, float humidity, float pressure, List<Float> forecastTemperatures) { 
   this.temperature = temperature;
   this.humidity = humidity;
   this.pressure = pressure; 
   this.forecastTemperatures = forecastTemperatures;
   notifyObservers();
 } 
   public float getTemperature() { return temperature; }
   public float getHumidity() { return humidity; }
   public float getPressure() { return pressure; } 
   public List<Float> getForecastTemperatures() { return forecastTemperatures; }}

觀察者:
1.觀察者持有被觀察者對象(WeatherData)
2.將自身傳遞給被觀察者(使用被觀察者的注冊方法)
3.提供一個方法,負(fù)責(zé)在被觀察者改變的時候刷新自身。(持有update方法,update方法實際做事情,該方法在被觀察者中被調(diào)用)

public class CurrentConditionsDisplay implements Observer, DisplayElement { 
        private WeatherData weatherData; //持有被觀察者對象
        private float temperature;
        private float humidity;
        private float pressure;
     public CurrentConditionsDisplay(WeatherData weatherData) {
        this.weatherData = weatherData;
        this.weatherData.registerObserver(this);//被觀察者對象拿到觀察者
    }

 @Override
 public void display() { 
        System.out.println("當(dāng)前溫度為:" + this.temperature + "℃");
        System.out.println("當(dāng)前濕度為:" + this.humidity); 
        System.out.println("當(dāng)前氣壓為:" + this.pressure); } 

@Override 
public void update() { 
      //數(shù)據(jù)都是通過被觀察者拿到的
      this.temperature = this.weatherData.getTemperature(); 
      this.humidity = this.weatherData.getHumidity();
      this.pressure = this.weatherData.getPressure(); 
      display(); 
    }
}

使用例子:

 //被觀察者
 WeatherData weatherData = new WeatherData(); 
 //觀察者
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
//被觀察者數(shù)據(jù)改變
 List<Float> forecastTemperatures = new ArrayList<Float>();
 forecastTemperatures.add(22f);
 forecastTemperatures.add(-1f);
 forecastTemperatures.add(9f);
 weatherData.changeWeatherData(22f, 0.8f, 1.2f, forecastTemperatures);
//被觀察者數(shù)據(jù)改變的時候(即調(diào)用changeWeatherData時,實際上內(nèi)部調(diào)用了觀察者的update方法,主動通知觀察者)

筆者使用實例:

場景:在RecycleView中需要一個測試每一個展示出來的ip的延時,并且展示在Recycleview上。延時的展示和其他數(shù)據(jù)的展示是不同步的。測量延時采用的策略是 ping 地址5秒后拿到一個結(jié)果。所以采用觀察者模式,當(dāng)獲取到延時數(shù)據(jù)(即數(shù)據(jù)改變的時候)更新UI。

Screenshot_2016-11-28-11-02-18-518_guo.com.busine.png

被觀察者RobotBean對象
1.持有觀察者對象:registerOberver方法
2.被觀察者改變的時候通知觀察者:notifyIpChange方法

Paste_Image.png

觀察者ViewHolder對象
1.持有被觀察對象

Paste_Image.png

2.傳遞觀察者:

Paste_Image.png

3.提供一個更新方法

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 訂閱報紙的過程## 來考慮實際生活中訂閱報紙的過程,這里簡單總結(jié)了一下,訂閱報紙的基本流程...
    七寸知架構(gòu)閱讀 4,644評論 5 57
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,823評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,716評論 25 708
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,804評論 2 17
  • 當(dāng)你看到這些細(xì)碎文字時,我正在開往福州的火車上,向南,向南。 想象過無數(shù)次自己的畢業(yè)季, 畢業(yè)旅行也好, 重回大一...
    文刀Van_Sword閱讀 345評論 0 1