对于RxJava核心思想的理解
- 本文概述:本文为RxJava系列第五篇文章,作为RxJava 设计模式的引子;文章以标准设计模式为主题,探究了标准观察者设计模式业务流程与设计思路。文章以简单示例向读者展示了,标准观察者设计模式在android 中的运用;
对于RxJava核心思想的理解
- 有一个起点一个终点,起点开始流向我们的事件(数据),把事件流向到终点,只不过在流向的过程中可以增加拦截(对事件类型、事件内容进行修改);终点只关心它的上一个拦截
- 后面一个拦截的输入,受上一个拦截(或者上一个点)的影响;
标准观察者设计模式
-
只有一个被观察者,多个观察者
-
实例:多个用户订阅同一微信公众号,公众号改变后,观察者可以发现改变
-
业务逻辑示意图:被观察者中存放所有观察者的容器,也可以放在被观察者的具体实现层
标准观察者模式代码:设计模式并没有标准实现
-
工程结构
-
被观察者:Observable
package com.xiangxue.rxjavademo.observer_model; // TODO 抽象层 被观察者 public interface Observable { //在被观察者中会有一个存放所有观察者的容器(写接口,面向更高层抽象) // 添加观察者 void addObserver(Observer observer); // 移除观察者 void removeObserver(Observer observer); // 被观察者发出了改变,通知观察者 void notifyObservers(); // 微信公众号的服务 编辑部门 发布一条消息 void pushMessage(String message); } -
被观察者的实现层:WechatServerObservable
package com.xiangxue.rxjavademo.observer_model; import java.util.ArrayList; import java.util.List; // 被观察者 实现 public class WechatServerObservable implements Observable { // 容器 存储 多个 观察者 private List<Observer> observers = new ArrayList<>(); //待发布的消息 private String message; @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { // 遍历容器:遍历所有的观察者 for (Observer observer : observers) { observer.update(message); } } @Override public void pushMessage(String message) { this.message = message; // System.out.println("微信服务号更新了消息:" + message); // 通知所有 关注了 此服务号的 用户 notifyObservers(); } } -
观察者:Observer
package com.xiangxue.rxjavademo.observer_model; // TODO 抽象层 观察者 public interface Observer { // 被观察者改变了,我这里可以知道 void update(Object value); } -
观察者具体实现层:UserPerson
package com.xiangxue.rxjavademo.observer_model; // 观察者具体实现层 public class UserPerson implements Observer { private static final String TAG = "UserPerson"; private String name; private String message; public UserPerson(String name) { this.name = name; } @Override public void update(Object value) { this.message = (String) value; // 读取消息 readMessage(); } private void readMessage() { Log.d(TAG,(name + " 收到了推送消息:" + message)); } } -
MainActivity
package com.xiangxue.rxjavademo.observer_model; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; /** * TODO 主要是标准观察者模式 * * todo# 使用场景例子 * 有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。 */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); test(); } public static void test() { // 编辑部 编辑好的文案内容 String msg = "重大消息:学Android程序员必须要学习Kotlin"; // 创建一个微信公众号服务(被观察者) Observable server = new WechatServerObservable(); // 创建 用户 (观察者) 多个 Observer zhangsan = new UserPerson("张三"); Observer lisi = new UserPerson("李四"); Observer wangwu = new UserPerson("王五"); Observer zhaoliu = new UserPerson("赵六"); // 订阅 注意:这里的订阅还是 被观察者.订阅(观察者) 关注 server.addObserver(zhangsan); server.addObserver(lisi); server.addObserver(wangwu); server.addObserver(zhaoliu); // 被观察者(微信平台) 发生了 改变,所有用户都会接受到改变 Log.d("UserPerson","第一次发送消息,测试所有观察者接受被观察者改变情况"); server.pushMessage(msg); // 张三 取消了关注 server.removeObserver(zhangsan); Log.d("UserPerson","第二次发送消息,测试移除张三功能"); // 再次微信平台 发生了 改变 server.pushMessage(msg); } } -
运行截图: