国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

[Android開發] RxJava2之路一 - 觀察者模式

2019-11-09 17:35:29
字體:
來源:轉載
供稿:網友

一、 簡介

是本人學習Rxjava的經驗總結,因為RxJava是基于這個模式的,所以我們先學習這個觀察者模式,是完全必要的。會了這個模式再看RxJava就簡單很多了。

二、啥是觀察者模式?

觀察者模式(Observer)模式: 是對象的行為模式,又叫做 發布-訂閱(Publish/Subscribe)模式、 模型-視圖(Model/View)模式、 源-監聽(Source/Listener)模式、 從屬(Depengdents)模式。

它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象是在狀態上發送變化時,會通知所有的觀察者對象,使得它們能夠自動更新自己。

UML圖: 這里寫圖片描述

抽象主題(Subject)角色: 抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數量的觀察者。 抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色。可以定義為接口或者抽象類,一般定義為抽象類

具體主題(ConcreteSubject)角色: 將有關聯狀態存入具體觀察者對象,在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知(調用抽象主題的notifyObserver)。具體主題角色又叫做具體觀察者(Concrete Observable)角色。

抽象觀察者(Observer)角色 一個接口。為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口。

具體觀察者(ConcreteObserver)角色 是抽象觀察者的實現類,實現父類的方法更新自己。存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態相協調。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用。

三、手動實現Demo

定義觀察者接口/** * 觀察者接口 * Created by Litp on 2017/2/7. */public interface Observer { void update(String state);}定義 被觀察者角色/** * 被觀察者 * Created by Litp on 2017/2/7. */public abstract class Subject { //觀察者集合 PRivate List<Observer> observers = new ArrayList<>(); /** * 添加觀察者 * @param observer 觀察者接口對象 */ public void attach(Observer observer){ observers.add(observer); System.out.println("添加觀察者:"); } /** * 移除觀察者 * @param observer 觀察者接口對象 */ public void dettch(Observer observer){ observers.remove(observer); System.out.println("移除一個觀察者:"); } /** * 通知所有觀察者更新狀態 * @param state 狀態 */ public void notifyObservers(String state){ //遍歷通知 for(Observer observer:observers){ observer.update(state); } }}具體觀察者/** * 具體觀察者 * Created by Litp on 2017/2/7. */public class GirlFriendObserver implements Observer { @Override public void update(String state) { System.out.println("接收到最新的消息:"+state); }}具體被觀察者角色/** * 具體被觀察者角色 * Created by Litp on 2017/2/7. */public class TianPingSubject extends Subject { /** * 調用即可通知所有的觀察者 * @param state 狀態 */ public void change(String state){ notifyObservers(state); }}客戶端實現/** * Created by Litp on 2017/2/7. */public class Client { public static void main(String[] args){ //創建觀察者 Observer observerFbb = new GirlFriendObserver(); Observer observerLss = new GirlFriendObserver(); //具體被觀察者 TianPingSubject tianPingSubject = new TianPingSubject(); //添加觀察者到 被觀察者 tianPingSubject.attach(observerFbb); tianPingSubject.attach(observerLss); //通知 tianPingSubject.change("起床啦"); //移除一個觀察者 tianPingSubject.dettch(observerFbb); //通知 tianPingSubject.change("刷牙啦"); }}

四、自帶的Observer

java自帶有觀察者對象,Observer是觀察者,Obserable是被觀察者。下面來一個demo,三個文件即可:

具體觀察者ConcreteObserverpublic class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(Observable observable, Object o) { System.out.println(this.name+"收到消息:"+o.toString()); }}具體 被觀察者ConcreteObserverpublic class ConcreteObservable extends Observable { public void change(String str){ //注意,這里需要setChanged一下才能通知 setChanged(); //通知觀察者 notifyObservers(str); }}實現類public class MainClass { public static void main(String[] args){ //具體創建觀察者 ConcreteObserver one = new ConcreteObserver("第一個"); ConcreteObserver two = new ConcreteObserver("第二個"); //創建具體被觀察者 ConcreteObservable obserable = new ConcreteObservable(); obserable.addObserver(one); obserable.addObserver(two); obserable.change("通知消息"); obserable.deleteObserver(one); obserable.change("繼續通知"); }}

編譯運行MainClass,即可輸出

第二個收到消息:通知消息第一個收到消息:通知消息第二個收到消息:繼續通知
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大城县| 沙河市| 华容县| 新建县| 赤壁市| 历史| 临清市| 小金县| 朔州市| 昌都县| 罗平县| 黔西县| 漳浦县| 峡江县| 泽普县| 新田县| 绥化市| 惠水县| 牡丹江市| 姜堰市| 遂溪县| 全州县| 青神县| 旺苍县| 德令哈市| 文水县| 禄丰县| 龙泉市| 黄骅市| 乌鲁木齐市| 亚东县| 柞水县| 南部县| 扶风县| 云梦县| 江油市| 合肥市| 西乡县| 乐至县| 商都县| 阿坝|