java设计模式学习之【观察者模式】

这篇具有很好参考价值的文章主要介绍了java设计模式学习之【观察者模式】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

想象你在一个在线拍卖会上竞标一件珍贵的艺术品。每当有人出价更高,系统都会立即通知你。这个实时更新机制使你可以做出快速反应。这种模式,在软件开发中称为观察者模式,是一种广泛应用于实现事件驱动系统的设计模式。

观察者模式简介

定义与用途

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象间的一种一对多的依赖关系,使得每当一个对象改变状态时,其所有依赖者都会得到通知并自动更新。这种模式用于构建松散耦合的系统,其中一个对象的改变可以影响一个或多个其他对象,而无需对象之间有紧密的关联。

实现方式

实现观察者模式通常涉及以下几个关键组件:

  • 主题(Subject):持有观察者的列表,并提供添加、删除观察者的接口。
  • 观察者(Observer):为那些在主题状态发生变化时需获得通知的对象定义一个更新接口。
  • 具体主题(Concrete Subject):状态发生改变时,向所有注册的观察者发出通知。
  • 具体观察者(Concrete Observer):实现观察者接口的类,定义当接收到主题通知时如何更新自己。

使用场景

观察者模式适用于以下场景:

  • 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象待改变时。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。

例如:

  • 股票市场应用:股票价格更新时,所有关注该股票的投资者都会收到通知。
  • 社交媒体订阅:用户在社交媒体上订阅某个名人或主题,当有更新时用户可以立即收到通知。
  • 电子邮件系统:当新邮件到达时,电子邮件客户端会通知用户。

优势与劣势

  • 优势
    • 支持简单的广播通信,解除对象间的紧密耦合。
    • 支持实时通知,对象状态改变时,观察者立即得到更新。
  • 劣势
    • 如果观察者非常多,通知会花费较多时间。
    • 如果观察者和主题之间有循环依赖,可能导致系统崩溃。

在Spring框架中的应用

Spring框架广泛应用了观察者模式,尤其是在事件驱动模型中。以下是一些具体应用:

1. 事件监听
Spring的事件监听机制就是观察者模式的一个例子。当一个事件被触发时,所有监听该事件的监听器都会收到通知。例如,ApplicationContext 发布了各种类型的事件,如 ContextRefreshedEvent,应用中的各个部分可以通过实现 ApplicationListener 来响应这些事件。

2. WebSocket
在Spring中,WebSocket的实现也使用了观察者模式。服务器和客户端之间的通信建立在这种模式上,当一方发送消息时,另一方可以即时接收和响应。

观察者示例

java设计模式学习之【观察者模式】,23种设计模式,java,设计模式,观察者模式
这个示例展示了观察者模式在Java中的实现。观察者模式是一种行为设计模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

步骤 1:创建主题类

private List<Observer> observers = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
      observers.add(observer);		
   }

   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   } 	

Subject 是持有观察者列表的类,并提供了方法来添加和删除观察者。当它的状态改变时,它会通知所有观察者。

步骤 2:创建观察者类

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

Observer 是一个抽象类,为所有具体的观察者定义了一个更新接口。每个具体的观察者都需要实现这个接口。

步骤 3:创建具体的观察者类

public class BinaryObserver extends Observer{

   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); 
   }
}

BinaryObserver 是一个具体的观察者,它将主题的状态以二进制形式输出。

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
     System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); 
   }
}

OctalObserver 是另一个具体的观察者,它将主题的状态以八进制形式输出。

public class HexaObserver extends Observer{

   public HexaObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); 
   }
}

HexaObserver 是第三个具体的观察者,它将主题的状态以十六进制形式输出。

步骤 4:使用主题和具体的观察者对象

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();

      new HexaObserver(subject);
      new OctalObserver(subject);
      new BinaryObserver(subject);

      System.out.println("第一次状态改变: 15");	
      subject.setState(15);
      System.out.println("第二次状态改变: 10");	
      subject.setState(10);
   }
}

java设计模式学习之【观察者模式】,23种设计模式,java,设计模式,观察者模式

在这个演示类中,我们创建了一个主题对象和三个观察者对象。然后我们改变了主题的状态,观察者会自动更新并打印出新的状态。

这个示例演示了观察者模式如何在软件设计中用于创建灵活的通知机制,当对象状态改变时,所有依赖于它的对象都会自动更新。这种模式使得对象之间的通信变得更加简洁和松耦合。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern文章来源地址https://www.toymoban.com/news/detail-772180.html

到了这里,关于java设计模式学习之【观察者模式】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java设计模式-观察者模式(jdk内置)

    上一篇我们学习了 观察者模式。 观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。 下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。

    2024年02月15日
    浏览(35)
  • Java设计模式-观察者模式-SpringBoot实现

    项目:https://gitee.com/KakarottoChen/blog-code.git 的:JavaSpringListener Java观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。在观察者模式中,当一个对象的状态发生变化时,它的所有依赖对象(观察者)都会自动收到通知并进行相应的更新。 观察者模式由以下几个核

    2024年02月08日
    浏览(36)
  • Java设计模式系列--观察者模式写法2:JDK

    原文网址:Java设计模式系列--观察者模式写法2:JDK_IT利刃出鞘的博客-CSDN博客 说明 本文用示例介绍观察者模式的一种写法:JDK。 JDK的观察者模式简介 在 Java 中,java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现这两个接口就可以编写观察者模式。 1. Ob

    2024年02月13日
    浏览(37)
  • 【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有一个天气预报项目,需求如下: 气象站可以将每天测量到的温度、湿度、气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压、湿度的接口 测量数据更新时,要能实时的通知给第三

    2024年02月14日
    浏览(35)
  • 设计模式-观察者模式

    观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者

    2024年02月15日
    浏览(55)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(61)
  • 【设计模式】观察者模式

    观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 Subject:抽象主题(被观察者

    2024年02月13日
    浏览(49)
  • 设计模式——观察者模式

    观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸,报社就是被观察者,订阅者就是观察者,订阅者通过订阅报纸与报社建立联系,而报

    2024年02月15日
    浏览(49)
  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(55)
  • 设计模式之观察者模式

    可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。 从报纸和杂志的订阅说起: 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不

    2024年01月24日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包