及時獲取一手信息,觀察者模式來幫忙

今天聊聊觀察者模式( Observer Pattern )。


目的


保持對象之間的聯動和最終一致。


例子代碼


疫情還沒過去, 生活還要繼續,最近從村裡來到了上海搬磚, 好慌呀: 一千米之內三個確診小區, 最近的 700 米......

回想疫情開始搶口罩沒搶過人家, 搶連花清瘟也沒搶過, 雙黃連口服液一醒來就沒了, 好氣呀

及時獲取一手信息,觀察者模式來幫忙


這就是定時看新聞不能及時獲取信息的結果, 所以這裡我向大家推薦新聞的自動推送強制提醒模式 -> 觀察者模式


及時獲取一手信息,觀察者模式來幫忙


比如,我們有個新聞熱詞的彙總搜索功能, 當新聞的熱詞更新的時候會發送給訂閱它的人。

先定義觀察者的通用接口(對應 java 中的 java.util.Observer):

<code>public interface Observer, O extends Observer, A> {

void update(S subject, A argument);
}
/<code>

上面的類會根據被觀察者的狀態變更調用 update 方法。

被觀察者的通用實現(對應 java.util.Observable):

<code>public abstract class Observable, O extends Observer, A> {

protected List observers;

public Observable() {
this.observers = new CopyOnWriteArrayList<>();
}

public void addObserver(O observer) {
this.observers.add(observer);
}

public void removeObserver(O observer) {
this.observers.remove(observer);
}

public void notifyObservers(A argument) {

for (O observer : observers) {
observer.update((S) this, argument);
}
}
}
/<code>

我們定義假設被觀察者是新聞的熱詞:

<code>public class COVID19MessageObervable extends Observable<covid19messageobervable> {
}/<covid19messageobervable>/<code>

我們定義觀察者是一個個人:

<code>@AllArgsConstructor
@Getter
public class PersonObserver implements Observer<covid19messageobervable> {

private String name;

@Override
public void update(COVID19MessageObervable subject, String argument) {
System.out.println("你好" + name + ", 趕緊囤 " + argument + " 吧");
}
}/<covid19messageobervable>/<code>


調用例子:

<code>COVID19MessageObervable newHotWorld = new COVID19MessageObervable();
newHotWorld.addObserver(new PersonObserver("codog"));
newHotWorld.addObserver(new PersonObserver("蘭蘭"));
newHotWorld.notifyObservers("口罩 + 酒精");
newHotWorld.notifyObservers("清瘟膠囊");
newHotWorld.notifyObservers("雙黃連口服液");/<code>

類圖:

及時獲取一手信息,觀察者模式來幫忙


課後作業


1.使用 java 自帶了 Observable 和 Observer 重寫文中的例子


2.實現一個併發的 notifyObservers 實現, 併發執行 overservers 中的 update 方法


3.當用戶賬號發生了系統扣款的情況,需要給用戶發送 APP 推送,郵件,短信,請使用觀察者模式和不使用觀察者模式實現,當這時候需求變更為還需要增加發送微信推送,發送釘釘消息,發送飛書通知,請比較二種時間的測試範圍不同和實現難度的不同


另外,codog溫馨提示:特殊時期一定要保護好自己喲


及時獲取一手信息,觀察者模式來幫忙


分享到:


相關文章: