IT铁人DAY 28-Observer 观察者模式

  今天要学习的是观察者模式,它主要的作用是设定一个订阅机制,当被订阅的物件有发生事件时就会去通知所有订阅的物件,现在让我们来认识它吧!


问题情境与解析

  假设某个影音平台提供用户可以建立自己的频道来上传影片,并提供给此平台所有的用户观看,若是用户对某个频道很感兴趣,可以每天上他的频道去查看有没有发布新的影片,有点浪费时间,另外,频道上传新的影片後,就会向所有用户发布通知,有兴趣的用户看到或许会是开心的,但不感兴趣的用户就会觉得非常恼人。

  如果套用观察者模式,让此平台提供一个订阅频道的服务,当某频道有上传新的影片,就会去通知有订阅此频道的所有订阅者,订阅者本身不用主动去看有订阅的频道有没有发布新的影片,省掉了订阅者主动去关注的时间,而且通知只会给有订阅的人,并不会发给没有订阅的用户,因此用户也不会收到莫名的频道发布影片的通知。

  以上述的例子,我们可以把频道视为Publisher,而订阅者就是Observer,每个Observer会实作相同的介面并且Publisher只会通过此介面与它们沟通,接着在在Publisher中建立一个订阅机制,可以让Observer订阅或是取消订阅;而当Publisher发布影片的时候,就会去遍历其订阅者并调用通知的方法将讯息传递给Observer。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211013/201407435zn2HoDsmN.png

Skeleton Code

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可以去订阅或取消订阅就可以罗!


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Google DSC 你也可以!

>>:  [Day29]领费币+布署链上

网路 Link Layer 笔记

Link Layer 是网路OSI 七层中的第二层,网卡发讯息时像是在多人环境中广播,大家都听的到。...

MSP430 在 linux 上的环境设定

如果是 debian 了话,要在 /etc/apt/source.list 加入 deb http:...

Day 10 - 用 canvas 复刻 小画家 放大镜

动手写看看 目前只能做到放大... const [magnifier, setMagnifier] ...

Day 29 Google Play评论爬取

今天的影片内容为爬取Google Play网页版应用程序的评论 并将前几天爬取AJAX网页(Dcar...

<Day28> Shioaji API 证券户登入 & 汇入凭证

● 这章会示范如何透过自己的证券户做登入以及汇入凭证 登入(Login) 之前几章我们所使用 Shi...