设计模式之:观察者模式与订阅发布区别+代码实现

  观察者模式和发布订阅模式有什么区别?大多数的回答都是: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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码厚炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值