[Day 4] Reactive Programming - 观察者模式Observer Pattern

https://refactoring.guru/design-patterns/observer

图片来源

前言

Reactive Programming 概念上与Observer Pattern非常相似,先来了解这个Design Pattern。

Observer Pattern

Observer Pattern 会有两种角色,一种是subject主体,是我们感兴趣的目标,另一种是observers观察者,观察者选择了各种感兴趣的主题去关注,当主题的状态发生变化的时候就会通知观察者。

生活中有很多例子,以前的送报纸,订报纸的人就是观察者,想了解新闻,所以报纸就会派发到家里。Youtube或是Twitch上的订阅制,使用者就是观察者,对哪一个实况主或是频道有兴趣,就点选订阅,当实况主开启直播、Youtuber发布新影片,就会有通知送达使用者,如果不使用Observer Pattern,使用者如果想要知道有没有新影片,就必须要时不时的去查看是否有更新,这还是用电脑,如果是想去看店家缺货已久的PS5游戏机是否已到货,若没有观察者模式可以订阅通知,则必须要出家门到店里面才能得知。
https://ithelp.ithome.com.tw/upload/images/20210918/20141418BngyS5sDZD.png

DEMO

实际设计一个简单的例子
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开始了解。

资料来源


<<:  Day 10 - TiFlash架构(下)

>>:  Day 18 「春暖鸭先知」TDD 来了

Day 07-制作购物车系统环境之Node.js

Node.js 在前面已经谈过罗。 指路--->https://ithelp.ithome.c...

鬼故事 - 灭证高手

鬼故事 - 灭证高手 Credit: Scooby-Doo 灵感来源:UCCU Hacker 故事开...

【在厨房想30天的演算法】Day 15 演算法 : 排序 sort II 堆积、合并、快速

Aloha!又是我少女人妻终於来到第 15 天了~不知不觉就过了一半了,大家有听过跑者愉悦理论吗,就...

Day15# Goroutines

铁人赛终於要过一半了,今天要来介绍 Go 的特色之一 -- Goroutines。 那麽话不多说,我...

D1 第零周:心态培养

D1-第零周:心态培养   这周是通知录取课程到课程正式开始之前的准备时间,这时间点只能看到第五期课...