RxJava 系列五:标准观察者设计模式的实现

185 阅读3分钟

对于RxJava核心思想的理解

  • 本文概述:本文为RxJava系列第五篇文章,作为RxJava 设计模式的引子;文章以标准设计模式为主题,探究了标准观察者设计模式业务流程与设计思路。文章以简单示例向读者展示了,标准观察者设计模式在android 中的运用;

对于RxJava核心思想的理解

  • 有一个起点一个终点,起点开始流向我们的事件(数据),把事件流向到终点,只不过在流向的过程中可以增加拦截(对事件类型、事件内容进行修改);终点只关心它的上一个拦截
  • 后面一个拦截的输入,受上一个拦截(或者上一个点)的影响;

标准观察者设计模式

  • 只有一个被观察者,多个观察者

  • 实例:多个用户订阅同一微信公众号,公众号改变后,观察者可以发现改变

  • 业务逻辑示意图:被观察者中存放所有观察者的容器,也可以放在被观察者的具体实现层

    image-20220627212700188

标准观察者模式代码:设计模式并没有标准实现

  • 工程结构

    image-20220627213412876

  • 被观察者: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);
         }
     }
    
  • 运行截图:

    image-20220627220352376