Reactive Programming 概念上与Observer Pattern非常相似,先来了解这个Design Pattern。
Observer Pattern
会有两种角色,一种是subject
主体,是我们感兴趣的目标,另一种是observers
观察者,观察者选择了各种感兴趣的主题去关注,当主题的状态发生变化的时候就会通知观察者。
生活中有很多例子,以前的送报纸,订报纸的人就是观察者,想了解新闻,所以报纸就会派发到家里。Youtube或是Twitch上的订阅制,使用者就是观察者,对哪一个实况主或是频道有兴趣,就点选订阅,当实况主开启直播、Youtuber发布新影片,就会有通知送达使用者,如果不使用Observer Pattern
,使用者如果想要知道有没有新影片,就必须要时不时的去查看是否有更新,这还是用电脑,如果是想去看店家缺货已久的PS5游戏机是否已到货,若没有观察者模式可以订阅通知,则必须要出家门到店里面才能得知。
实际设计一个简单的例子
Subject与Observer的Interface,定义出基本的订阅、取消订阅、通知与更新的方法。
public interface Subject {
void subscribe(Observer observer);
void unsubscribe(Observer observer);
void notifyObservers();
}
public interface Observer {
void update(String name);
}
实作使用者与YotubeChannel类别,更新状态印出频道名称。频道纪录订阅者与频道名称,订阅决定是否放入订阅者名单当中,更新时会通知所有订阅者。
public class User implements Observer{
@Override
public void update(String name) {
System.out.println(name + "更新罗");
}
}
@Data
@NoArgsConstructor
public class YoutubeChannel implements Subject{
private String name;
private List<Observer> users;
public YoutubeChannel(String name) {
this.name = name;
users = new ArrayList<>();
}
@Override
public void subscribe(Observer observer) {
users.add(observer);
}
@Override
public void unsubscribe(Observer observer) {
users.remove(observer);
}
@Override
public void notifyObservers() {
users.forEach(user -> user.update(name));
}
}
最後执行测试,创立一个User并订阅两个频道,当两个频道更新时就可以看见通知,而取消订阅CS50後就只会通知一个。
@Test
void test() {
User user = new User();
YoutubeChannel cs50 = new YoutubeChannel("CS50");
YoutubeChannel springDevelop = new YoutubeChannel("SpringDevelop");
cs50.subscribe(user);
springDevelop.subscribe(user);
cs50.notifyObservers();
springDevelop.notifyObservers();
cs50.unsubscribe(user);
cs50.notifyObservers();
springDevelop.notifyObservers();
/*
output:
CS50更新罗
SpringDevelop更新罗
SpringDevelop更新罗
*/
}
如果你已经了解Event-driven
,应该会觉得十分熟悉,只是Event-driven
通常中间会有一个Queue但是Observer Pattern
则不一定。了解Observer Pattern
之後下一篇就要开始真正进入Reactive Programming,会先从Java 9开始了解。
Node.js 在前面已经谈过罗。 指路--->https://ithelp.ithome.c...
鬼故事 - 灭证高手 Credit: Scooby-Doo 灵感来源:UCCU Hacker 故事开...
Aloha!又是我少女人妻终於来到第 15 天了~不知不觉就过了一半了,大家有听过跑者愉悦理论吗,就...
铁人赛终於要过一半了,今天要来介绍 Go 的特色之一 -- Goroutines。 那麽话不多说,我...
D1-第零周:心态培养 这周是通知录取课程到课程正式开始之前的准备时间,这时间点只能看到第五期课...