进阶3_RxJava1_观察者设计模式

来源:互联网 发布:远程数据传输软件 编辑:程序博客网 时间:2024/06/05 19:04

进阶3_更好的异步RxJava 1 观察者设计模式


RxJava上手难度还是蛮大的,官方的解释就是一句话更好的异步。要想全面的了解RxJava,我觉得首先得从观察者设计模式入手。

什么是观察者设计模式

也叫发布/订阅模式。是一种一对多的依赖关系,多个观察者对象会因为被观察对象的改变而随之产生行为。

在安卓当中也有很多该模式的运用,比如广播,广播是被观察者,广播接收器则是观察者,当广播发出以后,存在着订阅关系,也就是我们在Intent-fiter当中过滤条件达成,那么相应的广播接受者就会做出相应的处理操作。

从文字到图形的理解

很清楚很直观的表现出一对多,连线部分则用来表示依赖关系。更重要的是站在一个开发者角度设计的时候,我们应该清楚,主题对象并不关心观察者到底是哪一个类型的,它只会关心你是否具备者观察的功能,也就是基于Java的单继承问题,我们会把观察者设计成一个借口,这样更加灵活,也贴切实际。也就是我不关心你是猫是狗,我只关心你是否具备观察的能力,还有你是否在观察我,如果都满足,那么当我发生更改,介于依赖关心,我会通知到你,你做出任何反应我是不关心的。同样道理主题对象也可以做成接口,来提升整个程序的灵活。这样你再来看类图应该就很好理解了。

在程序上我们使用集合来代表一对多关系,集合当中存放具备观察能力的对象就OK,使用attch()和detach()来决定建立和取消这种依赖关系,实现无非是在集合当中做相应的增加、移除操作。notify便是我们在主题对象发生更改的时候,遍历整个集合让他们自己去做更新就ok。形象一点,attch就是建立两者之间的线,detach便是取消,当主题对象发生改变,会顺着这些线条去提醒观察者对象,来做到更新自己。就是这么一回事

从图形到代码的实现

代码的代建,肯定是从抽象到具体。

interface Observer

public interface Observer {void update(String updateState);}

abstract class Subject

public abstract class Subject {private ArrayList<Observer> observers;private String name;public Subject(String name){    this.observers = new ArrayList<Observer>();    this.name = name + "Subject";    }/* 确定依赖关系 */    public void attach(Observer observer){    if(observer != null){        this.observers.add(observer);        }    }/* 取消依赖关系 */public void detach(Observer observer){    if(observer != null){        this.observers.remove(observer);        }    }/* 更新操作 */public void notifyAllObserver(String updateState){    for(Observer tempObserver : this.observers){        tempObserver.update(updateState);        }    }}

观察者实现类

public class FirstObserver implements Observer{private String observerState;private String name;public FirstObserver(String name){    this.name = name;    }public String getObserverState(){    return this.observerState;    }public void update(String updateState){    this.observerState = updateState;    }public String toString(){    return this.name+"-observer";    }}

主题实现类

public class FirstSubject extends Subject {public FirstSubject(String name) {    // TODO: Add your code here    super(name);}/* 模拟给外部 触发状态更改操作 */public void change(String updateState){    /* 状态更改 提醒观察者更新 */    notifyAllObserver(updateState); }}

测试类

 public static void main(String[] args) {    /* 单个主题对象 */    FirstSubject subject =  new FirstSubject("产品1");    /* 多个观察者对象 这里就都用FirstOvserver了 */    FirstObserver firstObserver = new FirstObserver("观察者1");    FirstObserver twoObserver = new FirstObserver("观察者2");    FirstObserver threeObserver = new FirstObserver("观察者3");    /* 确定依赖关系 也可以称之为订阅 */    subject.attach(firstObserver);    subject.attach(twoObserver);    subject.attach(threeObserver);    /* 模拟状态更改 */    subject.change("开始");    subject.change("执行");    subject.change("结束");   }

从结果就可以得出,当我状态发生更改以后,会触发提醒所有观察者notifyAllObserver,从而达到更新其自己的效果。这就是观察者设计模式,有了这个基础再去看RxJava就会容易些了。