及时获取一手信息,观察者模式来帮忙

81 阅读2分钟

今天聊聊观察者模式( Observer Pattern )

1
**目的**

保持对象之间的联动和最终一致。

2
**例子代码**

疫情还没过去, 生活还要继续,最近从村里来到了上海搬砖, 好慌呀: 一千米之内三个确诊小区, 最近的 700 米......

回想疫情开始抢口罩没抢过人家, 抢连花清瘟也没抢过, 双黄连口服液一醒来就没了, 好气呀😢

这就是定时看新闻不能及时获取信息的结果, 所以这里我向大家推荐新闻的自动推送强制提醒模式 -> 观察者模式

比如,我们有个新闻热词的汇总搜索功能, 当新闻的热词更新的时候会发送给订阅它的人。

先定义观察者的通用接口(对应 java 中的 java.util.Observer):

public interface Observer<S extends Observable<S, O, A>, O extends Observer<S, O, A>, A> {  void update(S subject, A argument);}

上面的类会根据被观察者的状态变更调用 update 方法。

被观察者的通用实现(对应 java.util.Observable):

public abstract class Observable<S extends Observable<S, O, A>, O extends Observer<S, O, A>, A> {  protected List<O> 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);    }  }}

我们定义假设被观察者是新闻的热词:

public class COVID19MessageObervable extends Observable<COVID19MessageObervable, PersonObserver,String> {}

我们定义观察者是一个个人:

@AllArgsConstructor@Getterpublic class PersonObserver implements Observer<COVID19MessageObervable, PersonObserver,String> {    private String name;    @Override    public void update(COVID19MessageObervable subject, String argument) {        System.out.println("你好" + name + ", 赶紧囤 " + argument + " 吧");    }}

调用例子:

COVID19MessageObervable newHotWorld = new COVID19MessageObervable();newHotWorld.addObserver(new PersonObserver("codog"));newHotWorld.addObserver(new PersonObserver("兰兰"));newHotWorld.notifyObservers("口罩 + 酒精");newHotWorld.notifyObservers("清瘟胶囊");newHotWorld.notifyObservers("双黄连口服液");

类图:

3
**课后作业**
  1. 使用 java 自带了 Observable 和 Observer 重写文中的例子

  2. 实现一个并发的 notifyObservers 实现, 并发执行 overservers 中的 update 方法

  3. 当用户账号发生了系统扣款的情况,需要给用户发送 APP 推送,邮件,短信,请使用观察者模式和不使用观察者模式实现,当这时候需求变更为还需要增加发送微信推送,发送钉钉消息,发送飞书通知,请比较二种时间的测试范围不同和实现难度的不同

另外,codog温馨提示:特殊时期一定要保护好自己哟😷

微信: