观察者模式和发布订阅模式

279 阅读3分钟

下载.jfif

观察者模式

观察者模式的定义:

指多个对象间存在一对多的依赖关系,当一个对象的状态发生变化的时候,所有依赖于它的对象都会发接到通知并且自动更新。

观察者模式是一种对象行为型模式,优点是:1、降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。2、目标和观察者之间建立了一套触发机制。

观察者的结构和实现

抽象主题角色(Subject):抽象目标类,它提供了一个用于保存观察者的容器,然后维护增加观察者和删除观察者的方法,还有通知观察者的抽象方法(负责调用)

具体主题角色(Concrete Subject):也叫做具体目标类,它实现具体目标中的通知的方法,当具体的主题的内部发生变化时,通过for循环遍历抽象目标类中的观察者来通知他们。

抽象观察者(Observer):它包含了一个更新自己的抽象的方法,当接到具体主体的更改的通知的时候被调用。

具体观察者角色(Concrete Observer):实现抽象观察者中定义的抽象方法,一边在接到通知时更改自身的状态。

1.  package net.biancheng.c.observer;
1.
1.  import java.util.*;
1.
1.  public class ObserverPattern {
1.  public static void main(String[] args) {
1.  Subject subject = new ConcreteSubject();
1.  Observer obs1 = new ConcreteObserver1();
1.  Observer obs2 = new ConcreteObserver2();
1.  subject.add(obs1);
1.  subject.add(obs2);
1.  subject.notifyObserver();
1.  }
1.  }
1.
1.  //抽象目标
1.  abstract class Subject {
1.  protected List<Observer> observers = new ArrayList<Observer>();
1.
1.  //增加观察者方法
1.  public void add(Observer observer) {
1.  observers.add(observer);
1.  }
1.
1.  //删除观察者方法
1.  public void remove(Observer observer) {
1.  observers.remove(observer);
1.  }
1.
1.  public abstract void notifyObserver(); //通知观察者方法
1.  }
1.
1.  //具体目标
1.  class ConcreteSubject extends Subject {
1.  public void notifyObserver() {
1.  System.out.println("具体目标发生改变...");
1.  System.out.println("--------------");
1.
1.  for (Object obs : observers) {
1.  ((Observer) obs).response();
1.  }
1.
1.  }
1.  }
1.
1.  //抽象观察者
1.  interface Observer {
1.  void response(); //反应
1.  }
1.
1.  //具体观察者1
1.  class ConcreteObserver1 implements Observer {
1.  public void response() {
1.  System.out.println("具体观察者1作出反应!");
1.  }
1.  }
1.
1.  //具体观察者1
1.  class ConcreteObserver2 implements Observer {
1.  public void response() {
1.  System.out.println("具体观察者2作出反应!");
1.  }
1.  }

v2-0a7ef7d1a328dc37eadefb29e0ea705d_r.jpg

发布-订阅模式

相信很多人认为发布就是观察者模式里的Subject,而订阅就是观察者模式里的Observer。其实并不然。
在发布订阅模式里,发布者并不会直接通知订阅者,换句话说,发布者和订阅者之间,彼此互不认识。
不认识怎么交流那?报社和订阅者怎么交流?通过邮差呗(第三者)
这里的第三者是消息队列里的,我们常说的经纪人Broker

v2-b6ed65f370a766620718ad4227d5d4e5_r.jpg 发布者只需要告诉Broker,我要发的消息,topic是AAA; 订阅者只需要告诉Broker,我要订阅topic是AAA的消息 于是当Broker收到消息,消息的topic是AAA的话,那么就将消息发送给订阅了topic是AAA的消息的订阅者。

v2-540a78ba3127b0c6882adc668e7a3535_r.jpg

观察者和被观察者是松散耦合的关系

发布者和订阅者是完全不耦合的状态