您的位置:首页 > 编程语言 > Java开发

进阶3_RxJava1_观察者设计模式

2017-05-16 19:23 351 查看

进阶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就会容易些了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: