一对多的依赖关系,在观察目标类里有一个 ArrayList 存放观察者们。当观察目标对象的状态发生改变,所有依赖于它的观察者都将得到通知,使这些观察者能够自动更新(即使用推送方式).此设计模式最重要的作用就是 解耦!将观察者与被观察者解耦,使得他们之间的依赖性更小。

关键字

  • Observable
    即被观察者,也可以被叫做主题(Subject)是被观察的对象。通常有注册方法(register),取消注册方法(remove)和通知方法(notify)。

  • Observer
    即观察者,可以接收到主题的更新。当对某个主题感兴趣的时候需要注册自己,在不需要接收更新时进行注销操作。

Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。 ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。 Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。 ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

例子与应用

举一个生活中的例子:比如用户从报社订阅报纸,报社和用户之间是一对多依赖,用户可以在报社订阅(register)报纸,报社可以把最新的报纸发给用户(notify),用户自动收到更新。在用户不需要的时候还可以取消注册(remove)。

示例

image.png

抽象观察者(Observer)

里面定义了一个更新的方法:

  1. public interface Observer {
  2. public void update(String message);
  3. }

具体观察者(ConcrereObserver)

微信用户是观察者,里面实现了更新的方法:

  1. public class WeixinUser implements Observer {
  2. // 微信用户名
  3. private String name;
  4. public WeixinUser(String name) {
  5. this.name = name;
  6. }
  7. @Override
  8. public void update(String message) {
  9. System.out.println(name + "-" + message);
  10. }
  11. }

抽象被观察者(Subject)

抽象主题,提供了attach、detach、notify三个方法:

  1. public interface Subject {
  2. /**
  3. * 增加订阅者
  4. * @param observer
  5. */
  6. public void attach(Observer observer);
  7. /**
  8. * 删除订阅者
  9. * @param observer
  10. */
  11. public void detach(Observer observer);
  12. /**
  13. * 通知订阅者更新消息
  14. */
  15. public void notify(String message);
  16. }

具体被观察者(ConcreteSubject)

微信公众号是具体主题(具体被观察者),里面存储了订阅该公众号的微信用户,并实现了抽象主题中的方法:

  1. public class SubscriptionSubject implements Subject {
  2. //储存订阅公众号的微信用户
  3. private List<Observer> weixinUserlist = new ArrayList<Observer>();
  4. @Override
  5. public void attach(Observer observer) {
  6. weixinUserlist.add(observer);
  7. }
  8. @Override
  9. public void detach(Observer observer) {
  10. weixinUserlist.remove(observer);
  11. }
  12. @Override
  13. public void notify(String message) {
  14. for (Observer observer : weixinUserlist) {
  15. observer.update(message);
  16. }
  17. }
  18. }

参考

https://juejin.im/entry/57f25c16da2f60004f675fd8 https://juejin.cn/post/6844903697781096455#heading-8 https://blog.csdn.net/itachi85/article/details/50773358