美文网首页
RxJava 中的设计模式(一)观察者模式

RxJava 中的设计模式(一)观察者模式

作者: 蓝笔头 | 来源:发表于2021-06-26 22:25 被阅读0次

介绍

观察者模式(Observer Pattern)定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。

观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。

观察者模式有一个别名叫 发布-订阅模式(Publish Subscribe Pattern),订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。

实现

观察者模式

代码:

@FunctionalInterface
public interface Observer<T> {
    void handle(T t);
}

public class Observable<T> {
    private List<Observer> observers = new ArrayList<>();

    public void subscribe(Observer<T> observer) {
        observers.add(observer);
    }

    public void notifyAll(T data) {
        observers.forEach(observer -> observer.handle(data));
    }
}

@Slf4j
public class Main {

    public static void main(String[] args) {
        Observable<String> observable = new Observable<>();
        observable.subscribe(data -> log.info("我是第一个观察者 {}", data));
        observable.subscribe(data -> log.info("I am the second observer {}", data));

        observable.notifyAll("通知");
    }
}

输出:

21:26:58.969 [main] INFO org.company.rxjava.pattern.Main - 我是第一个观察者 通知
21:26:58.979 [main] INFO org.company.rxjava.pattern.Main - I am the second observer 通知

可观察对象(Observable)内部维护了观察者(Observer)的引用集合,在有事件发生时,通过 notifyAll() 方法通知所有的观察者(Observer)。

RxJava 中的观察者模式

代码:

public interface Observer<T> {
    void onNext(T t);
}

public class Emitter<T> {
    private Observer<T> observer;

    public Emitter(Observer<T> observer) {
        this.observer = observer;
    }

    public void onNext(T t) {
        this.observer.onNext(t);
    }
}

public interface ObservableOnSubscribe<T> {
    void subscribe(Emitter<T> emitter);
}

public class Observable<T> {
    private ObservableOnSubscribe<T> source;

    public Observable(ObservableOnSubscribe<T> source) {
        this.source = source;
    }

    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        return new Observable<>(source);
    }

    public void subscribe(Observer<T> observer) {
        Emitter<T> emitter = new Emitter<>(observer);
        this.source.subscribe(emitter);
    }
}

@Slf4j
public class Main {

    public static void main(String[] args) {
        // 1. 创建一个 Observable 对象
        // 2. ObservableOnSubscribe 的 subscribe(Emitter emitter) 方法表示在 Observer 订阅时需要执行的操作
        // 3. 通过实现 ObservableOnSubscribe 接口,延迟 subscribe(Emitter emitter) 中 emitter 的逻辑处理
        Observable observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(Emitter emitter) {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
            }
        });

        // 4. Observer 订阅到 Observable 上
        // 5. subscribe() 会创建一个 Emitter 并把 observer 关联到 Emitter 上。
        // 6. 调用 ObservableOnSubscribe 的 subscribe() 方法,开始事件流处理
        observable.subscribe(new Observer<Integer>() {
            @Override
            public void onNext(Integer o) {
                log.info("onNext {}", o);
            }
        });
    }
}

输出:

22:06:38.601 [main] INFO org.company.rxjava.pattern.Main - onNext 1
22:06:38.610 [main] INFO org.company.rxjava.pattern.Main - onNext 2
22:06:38.611 [main] INFO org.company.rxjava.pattern.Main - onNext 3

类结构分析:

  • Observer:观察者,或者称为事件处理者
  • Emitter:事件发射器。用来发送一个或多个事件。
  • Observable:可观察对象。用来连接事件发送者和事件处理者。
  • ObservableOnSubscribe:让 EmitterObserver 订阅(调用 Observable.subscribe() 方法)到 Observable 时,才触发事件发送逻辑。

subscribe() 被调用时,才开始整个事件流处理。
在此之前只是设置一些事件处理上下文。

参考

相关文章

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 观察者模式在RxJava中的运用(一)RxJava整体框架分析

    观察者模式在RxJava中的运用(一)RxJava整体框架分析 1、传统观察者模式的定义 抽象被观察者角色Obse...

  • RxJava 的初理解和基本使用

    观察者设计模式 提到RxJava 有点了解的就知道这个框架是基于观察者模式的,先来温习下观察者模式。 被观察者(O...

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • Rxjava的基础操作符

    Rxjava原理介绍Rxjava原理 基于 一种扩展的观察者模式Rxjava的扩展观察者模式中有4个角色:被观察者...

  • java设计模式之观察者模式实例讲解

    在设计模式中,观察者是使用率非常高的设计模式之一,特别是在android中,一些订阅,RxJAVA...等等,都用...

  • RxJava观察者模式

    1.点击事件的观察者模式: 2.通用观察者模式: 3.RxJava的观察者模式 RxJava使用的是扩展的观察者模...

  • 写给自己的RxJava -- 基础篇

    Rxjava基于观察者模式,一个完整的观察者模式要有三个角色对象:观察者,被观察者,事件。 而且在异步观察者模式中...

  • Java 理解观察者模式

    前言:最近在学习RxJava,RxJava在观察者模式的基础上做了扩展,本文带大家了解观察者模式 什么是观察者模式...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:RxJava 中的设计模式(一)观察者模式

      本文链接:https://www.haomeiwen.com/subject/cpnzyltx.html