今天要学习的是观察者模式,它主要的作用是设定一个订阅机制,当被订阅的物件有发生事件时就会去通知所有订阅的物件,现在让我们来认识它吧!
假设某个影音平台提供用户可以建立自己的频道来上传影片,并提供给此平台所有的用户观看,若是用户对某个频道很感兴趣,可以每天上他的频道去查看有没有发布新的影片,有点浪费时间,另外,频道上传新的影片後,就会向所有用户发布通知,有兴趣的用户看到或许会是开心的,但不感兴趣的用户就会觉得非常恼人。
如果套用观察者模式,让此平台提供一个订阅频道的服务,当某频道有上传新的影片,就会去通知有订阅此频道的所有订阅者,订阅者本身不用主动去看有订阅的频道有没有发布新的影片,省掉了订阅者主动去关注的时间,而且通知只会给有订阅的人,并不会发给没有订阅的用户,因此用户也不会收到莫名的频道发布影片的通知。
以上述的例子,我们可以把频道视为Publisher,而订阅者就是Observer,每个Observer会实作相同的介面并且Publisher只会通过此介面与它们沟通,接着在在Publisher中建立一个订阅机制,可以让Observer订阅或是取消订阅;而当Publisher发布影片的时候,就会去遍历其订阅者并调用通知的方法将讯息传递给Observer。
import java.util.ArrayList;
interface Observer {
public void update(State state);
}
class ConcreteObserver implements Observer {
public void update(State state) {
// do something
}
}
class Publisher {
ArrayList<Observer> observers = new ArrayList<Observer>();
private State state;
public void subscribe(Observer o) {
observers.add(o);
}
public void unsubscribe(Observer o) {
observers.remove(observers.indexOf(o));
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this.state);
}
}
public void updateState(State s) {
this.state = s;
notifyObservers();
}
}
当一个物件有状态改变,而这个改变可能会需要改变其他物件的时候,或是某些物件需要观察其他物件的时候,这就可以使用观察者模式来解决,在Publisher中建立订阅机制,让Observer可以去订阅或取消订阅就可以罗!
除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章
juck30808 - Python - 数位行销分析与 Youtube API 教学
SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?
Link Layer 是网路OSI 七层中的第二层,网卡发讯息时像是在多人环境中广播,大家都听的到。...
如果是 debian 了话,要在 /etc/apt/source.list 加入 deb http:...
动手写看看 目前只能做到放大... const [magnifier, setMagnifier] ...
今天的影片内容为爬取Google Play网页版应用程序的评论 并将前几天爬取AJAX网页(Dcar...
● 这章会示范如何透过自己的证券户做登入以及汇入凭证 登入(Login) 之前几章我们所使用 Shi...