- 看到一篇关于关于观察者模式和发布订阅模式的区别的文章,感觉写的很好,做个笔记。文章来自观察者模式 vs 发布订阅模式 - 知乎 (zhihu.com)
观察者模式
观察者模式的定义:
指多个对象间存在一对多的依赖关系,当一个对象的状态发生变化的时候,所有依赖于它的对象都会发接到通知并且自动更新。
观察者模式是一种对象行为型模式,优点是: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. }
发布-订阅模式
相信很多人认为发布就是观察者模式里的Subject,而订阅就是观察者模式里的Observer。其实并不然。
在发布订阅模式里,发布者并不会直接通知订阅者,换句话说,发布者和订阅者之间,彼此互不认识。
不认识怎么交流那?报社和订阅者怎么交流?通过邮差呗(第三者)
这里的第三者是消息队列里的,我们常说的经纪人Broker
发布者只需要告诉Broker,我要发的消息,topic是AAA;
订阅者只需要告诉Broker,我要订阅topic是AAA的消息
于是当Broker收到消息,消息的topic是AAA的话,那么就将消息发送给订阅了topic是AAA的消息的订阅者。
观察者和被观察者是松散耦合的关系
发布者和订阅者是完全不耦合的状态