本篇文章已受權微信公衆號 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=取消關注
複製代碼