二十三种设计模式第十六篇--观察者模式

观察者模式是一种行为型设计模式,它建立了一种对象间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现对象间的松耦合通信,提高系统的可扩展性和灵活性。

观察者模式的核心主题

观察者模式的核心是两个角色:主题(Subject)和观察者(Observer)。主题是被观察的对象 ,它维护了一个观察者列表,并提供了注册、删除和通知观察者的方法。观察者是依赖于主题的对象 ,它定义了更新的接口,以使得在主题状态改变时能够得到通知并进行相应的操作。

在观察者模式中,当主题的状态发生变化时,它会遍历观察者列表并调用每个观察者的更新方法,从而实现观察者的自动更新。这种方式下,主题和观察者之间的耦合度较低,它们可以独立地进行扩展和变化,而不会影响到对方。

java 复制代码
public abstract class Observer {
   /**
    * ***要监听主题
    */
   protected Subject subject;

   //*****回调方法
   public abstract void update();
}
java 复制代码
public class BinaryObserver extends Observer {


   public BinaryObserver(Subject subject){
      this.subject = subject;
      //****注册:将自身注册到  subject被观察者的列表
      this.subject.attach(this);
   }
   //****只要被 观察 的对象(主题)状态发生变化 ,则由subject自动调用此方法
   @Override
   public void update() {
      //将主题中变化的状态值(数字)转为二进制.
      System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) );
   }
}
java 复制代码
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() );
   }
}
java 复制代码
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() ) );
   }
}
java 复制代码
public class Subject {
   //*****观察者列表: 存所有注册的观察者.
   private List<Observer> observers = new ArrayList<Observer>();

   private int state;  //待观察的状态
 
   public int getState() {
      return state;
   }

   //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();   //通知.
      }
   }  
}
java 复制代码
public class ObserverPatternDemo {
   public static void main(String[] args) {

      Subject subject = new Subject();  //抽象主题(Subject)角色:也叫抽象目标类,它保存观察者对象
      //1. 将观察者注册到注册上.
      new HexaObserver(subject);
      new OctalObserver(subject);
      new BinaryObserver(subject);

      //2. 状态修改,发出通知.
      System.out.println("修改状态值: 15");
      subject.setState(15);  //只要subject状态一变,则发出通知

//      System.out.println("第二次修改状态值: 10");
//      subject.setState(10);
   }
}

观察者模式的应用场景非常广泛。例如,在图形界面开发中,我们经常使用观察者模式来实现事件驱动的编程 ,当用户执行某些操作时,界面会自动更新以反映新的状态。另外,观察者模式还常用于发布-订阅系统、消息队列、用户订阅通知等场景

在JavaScript中,观察者模式也有着广泛的应用。通过使用观察者模式,我们可以实现自定义事件和事件监听器,使得不同的对象能够相互通信并响应事件的发生。这在JavaScript框架和库中非常常见。

结论

总结起来,观察者模式是一种实现对象间松耦合通信的设计模式,它通过建立主题和观察者之间的依赖关系,实现了当主题状态变化时自动通知观察者的机制。观察者模式具有很高的灵活性和可扩展性,在各种应用场景中都有着重要的作用。

相关推荐
泡泡以安1 小时前
【Android逆向工程】第3章:Java 字节码与 Smali 语法基础
android·java·安卓逆向
毕设源码-朱学姐7 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
Spring AI学习8 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
java1234_小锋9 小时前
Spring IoC的实现机制是什么?
java·后端·spring
xqqxqxxq10 小时前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
消失的旧时光-194310 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊10 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
4311媒体网10 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php
zwxu_10 小时前
Nginx NIO对比Java NIO
java·nginx·nio
可观测性用观测云11 小时前
Pyroscope Java 接入最佳实践
java