观察者模式和发布订阅模式有什么区别?大多数的回答都是:Publishers + Subscribers = Observer Pattern,24种基本的设计模式并没有发布-订阅模式,发布订阅模式属于并发型模式;像典型的Mq;这两种相似单并不可以划等号。
我们来重新来回顾一下这两种模式:
Observer Pattern
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。而观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
Pub-Sub Pattern
在“发布者-订阅者”模式中,称为发布者的消息发送者不会将消息编程为直接发送给称为订阅者的特定接收者。这意味着发布者和订阅者不知道彼此的存在。存在第三个组件,称为代理或消息代理或事件总线,它由发布者和订阅者都知道,它过滤所有传入的消息并相应地分发它们。换句话说,pub-sub是用于在不同系统组件之间传递消息的模式,而这些组件不知道关于彼此身份的任何信息。经纪人如何过滤所有消息?实际上,有几个消息过滤过程。最常用的方法有:基于主题和基于内容的。
这两种模式之间的主要区别可以如下所示:
1. 在Observer模式中,Observers知道Subject,同时Subject还保留了Observers的记录。然而,在发布者/订阅者中,发布者和订阅者不需要彼此了解。他们只是在消息队列或代理的帮助下进行通信。
2. 观察者模式主要以同步方式实现,即当某些事件发生时,Subject调用其所有观察者的适当方法。发布者/订阅者在大多情况下是异步方式(使用消息队列)。
3. 观察者模式需要在单个应用程序地址空间中实现。另一方面,发布者/订阅者模式更像是跨应用程序
观察者模式典型代码:
模型图
Subject类(抽象通知者)
public abstract class Subject {
// 定义一个观察者集合用于存储所有观察者对象
protected List<Observer> list = new ArrayList<Observer>();
// 增加观察者
public void attach (Observer observer) {
list.add(observer);
}
// 移除观察者
public void detach (Observer observer) {
list.remove(observer);
}
// 通知者
public void Notify ();
}
Observer 类(抽象观察者)
public abstract class Observer {
public abstract void update();
}
ConcreteSubject类(具体通知者)
public class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
@Override
public void Notify() {
for (Observer observer: list) {
observer.update();
}
}
}
ConcreteObserver类(具体观察者)
public class ConcreteObserver extends Observer {
private String name;
private String observerState;
private ConcreteSubject concreteSubject;
public ConcreteObserver(ConcreteSubject concreteSubject,String name) {
this.concreteSubject = concreteSubject;
this.name = name;
}
@Override
public void update() {
observerState = concreteSubject.getSubjectState();
System.out.println("name :"+name);
System.out.println("observerState :"+observerState);
}
public ConcreteSubject getConcreteSubject() {
return concreteSubject;
}
public void setConcreteSubject(ConcreteSubject concreteSubject) {
this.concreteSubject = concreteSubject;
}
}
测试方法:
public static void main(String[] args) {
ConcreteSubject s = new ConcreteSubject();
s.attach(new ConcreteObserver(s,"X"));
s.attach(new ConcreteObserver(s,"Y"));
s.attach(new ConcreteObserver(s,"Z"));
s.setSubjectState("ABC");
s.Notify();
}
测试结果如下:
name :X
observerState :ABC
name :Y
observerState :ABC
name :Z
observerState :ABC
文章参考地址:1、https://www.cnblogs.com/viaiu/p/9939301.html
2、https://mp.weixin.qq.com/s/inZo1Rfz-gKeziKKqbfKdw