本篇文章已受权微信公众号 YYGeeker
独家发布转载请标明出处设计模式
CSDN学院课程地址bash
- RxJava2从入门到精通-初级篇:edu.csdn.net/course/deta…
- RxJava2从入门到精通-中级篇:edu.csdn.net/course/deta…
- RxJava2从入门到精通-进阶篇:edu.csdn.net/course/deta…
- RxJava2从入门到精通-源码分析篇:edu.csdn.net/course/deta…
观察者模式就是RxJava使用的核心点,掌握这个模式,能够理解RxJava更简单,观察者模式简单的说就是”订阅-发布”的模式,举一例子说,当你订阅某家牛奶店的早餐奶(订阅过程),只要牛奶店生产牛奶,便会给你送过去(发布过程)。这里的牛奶店只有一家,可是订阅的人能够不少,这是一种一对多的关系,只要牛奶店发布牛奶,那么订阅的人就会收到牛奶。换作RxJava里面的话,牛奶店就是被观察者(Observable),订阅的人就是观察者(Observer),根据这个例子,咱们经过代码来实现这段逻辑微信
一、建立观察者和被观察者并发
//被观察者
public interface Observable {
//订阅
void subscribe(Observer observer);
//取消订阅
void cancel(Observer observer);
//发布
void onNext();
}
复制代码
//观察者
public interface Observer {
//接收通知
void onNotify();
}
复制代码
二、实现观察者和被观察者异步
//牛奶店
public class MilkFactory implements Observable{
private List<Observer> observers;
public MilkFactory() {
this.observers = new ArrayList<>();
}
@Override
public void subscribe(Observer observer) {
observers.add(observer);
}
@Override
public void cancel(Observer observer) {
observers.remove(observer);
}
@Override
public void onNext() {
for (Observer observer : observers) {
observer.onNotify();
}
}
}
复制代码
//顾客
public class MilkConsumer implements Observer {
private String name;
public MilkConsumer(String name) {
this.name = name;
}
@Override
public void onNotify() {
System.out.println(this.name + " 收到牛奶");
}
}
复制代码
三、观察者订阅被观察者ide
public static void main(String[] args) {
Observable milkFactory = new MilkFactory();
Observer milkConsumer1 = new MilkConsumer("顾客1");
Observer milkConsumer2 = new MilkConsumer("顾客2");
//订阅过程
milkFactory.subscribe(milkConsumer1);
milkFactory.subscribe(milkConsumer2);
//发布过程
System.out.println("此时,牛奶店已经产出早餐奶,通知并发送给各位顾客");
milkFactory.onNext();
}
复制代码
四、查看程序输出的结果源码分析
此时,牛奶店已经产出早餐奶,通知并发送给各位顾客
顾客1 收到牛奶
顾客2 收到牛奶
复制代码
RxJava中的观察者模式也是跟例子中的大同小异,也是经过建立出观察者和被观察者,而后进行订阅事件,只不过这里的观察者和被观察者已经不在是咱们自定义的两个接口类,而是经过RxJava提供好的观察者和被观察者ui
public static void main(String[] args) {
//拿到被观察者
Observable<String> observable = getObservable();
//拿到观察者
Observer<String> observer = getObserver();
//订阅
observable.subscribe(observer);
}
复制代码
public static Observable<String> getObservable() {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("俊俊俊很帅");
e.onNext("你值得拥有");
e.onNext("取消关注");
e.onNext("但仍是要保持微笑");
e.onComplete();
}
});
}
public static Observer<String> getObserver() {
return new Observer<String>() {
Disposable disposable = null;
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onNext(String s) {
System.out.println("onNext=" + s);
if (s.equals("取消关注")) {
//断开订阅
disposable.dispose();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
};
}
复制代码
这段代码可能看起来比较陌生,不用担忧,咱们会在后面的文章中一个个来解释这里每一个方法的含义,咱们能够经过程序的输出结果看出,跟刚才咱们的例子是同样的效果的this
onNext=俊俊俊很帅
onNext=你值得拥有
onNext=取消关注
复制代码