设计模式-观察者模式

embedded/2024/9/23 18:27:54/

概述

  • 观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它主要用于解决对象间的一对多依赖问题,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并自动更新状态,无需显式调用。
  • 该模式的核心思想是解耦,通过引入中间层,确保主题(Subject)与观察者(Observer)之间的松耦合联系。

核心思想

  • 抽象主题(Subject):持有多个观察者对象的引用,抽象主题提供了一个接口可以增加和删除观察者对象;有一个观察者数组,并实现增、删及通知操作
  • 具体主题(Concrete Subject):将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知
  • 抽象观察者(Observer):定义一个接口,包含更新方法,供具体的观察者实现
  • 具体观察者(Concrete Observer):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态保持一致

在这里插入图片描述

场景使用

  • GUI应用程序
    • 在图形用户界面(GUI)开发中,观察者模式用于建立组件之间的联动关系。例如,当用户在界面上的一个控件(如文本框)中输入数据时,其它相关控件(如统计面板或图表)能够实时更新显示。
  • 订阅/发布系统
    • 在消息传递或事件驱动架构中,观察者模式常用于实现发布-订阅机制。发布者(Subject)向订阅者(Observers)发送通知,如在消息队列、事件总线或RSS新闻订阅系统中,每当有新消息或文章发布时,所有已订阅的用户或组件都会接收到更新通知。
  • 数据绑定
    • 在前端框架(如Angular、Vue、React)中,数据双向绑定就是观察者模式的一种体现。视图层作为观察者监听模型层数据的变化,一旦模型数据更改,视图层能自动更新。
  • 数据库同步
    • 数据库触发器或者缓存系统,当数据库表中的记录发生变化时,可以触发一系列的后续操作,如更新关联表、清除缓存或通知其他服务进行数据同步。

总之,观察者模式适用于任何需要在对象状态改变时自动通知多个对象,并且这些对象需要及时作出相应更新的情况。这样可以保持对象间的松耦合,提高程序的可维护性和可扩展性。

优缺点

优点

  • 降低了目标与观察者之间的耦合关系,目标与观察者之间建立了一套触发机制
  • 观察者和被观察者是抽象耦合的

缺点

  • 观察者和观察目标之间有循环依赖的话,会触发它们之间进行循环调用,可能导致系统崩溃
  • 一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间

示例

Subject 抽象主题


import java.util.ArrayList;
import java.util.List;public class Subject {private List<Observer> observerList = new ArrayList<>();/*** 新增观察者** @param observer*/public void addObserver(Observer observer) {this.observerList.add(observer);}/*** 删除观察者** @param observer*/public void deleteObserver(Observer observer) {this.observerList.remove(observer);}public void notifyAllObserver() {for (Observer observer : this.observerList) {observer.update();}}
}

BossConcreteSubject 具体主题

public class BossConcreteSubject extends Subject {public void doSomething() {System.out.println("老板完成自己的工作");//业务操作System.out.println("视察公司工作情况");super.notifyAllObserver();}}

Observer 抽象观察者

public interface Observer {/*** 观察到消息后进行的操作,就是响应*/void update();
}

具体观察者

public class XSConcreteObserver implements Observer {@Overridepublic void update() {System.out.println("小帅发现领导到来,暂停在线摸鱼,回归工作");}
}
public class XMConcreteObserver implements Observer {@Overridepublic void update() {System.out.println("小美发现领导到来,暂停在线摸鱼,回归工作");}
}

测试

public class Main {public static void main(String[] args) {//创建一个主题,老板BossConcreteSubject subject = new BossConcreteSubject();//创建观察者,就是摸鱼的同事Observer xmObserver = new XMConcreteObserver();//创建观察者,就是摸鱼的同事Observer xsObserver = new XSConcreteObserver();//建立对应的关系,老板这个主题被同事进行观察subject.addObserver(xsObserver);subject.addObserver(xmObserver);//主题开始活动,里面会通知观察者(相当于发布消息)subject.doSomething();}
}

在这里插入图片描述


http://www.ppmy.cn/embedded/7790.html

相关文章

一个java项目各个层级的介绍

在springbootmybatisplus的项目中&#xff08;使用lombok&#xff09; entity类可以使用Data注解来加入get、set等方法 这里值得注意的是该类实现了Serializable类&#xff0c;目的是实现序列化&#xff0c;在 Java 和其他语言进行通信的时候&#xff0c;需要将对象转化成一种通…

Redis入门

1.初始Redis Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型 NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串、数值、甚至json&#xff1a;…

Node.js

js生成参数,提高定制化能力,需要用到nodejs.更快执行js代码的环境. Node.js和浏览器差距. Node.js可以做到本地文件读写&#xff0c;HTTP网络请求及响应&#xff0c;socket监听请求等&#xff1b;cmd mac系统的功能. 在Node.js上尽量不要执行未知代码. Node.js主要提高性能. 在…

JavaEE 初阶篇-深入了解 I/O 流(FileInputStream 与 FileOutputStream 、Reader 与 Writer)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 I/O 流概述 2.0 文件字节输入流(FileInputStream) 2.1 创建 FileInputStream 对象 2.2 读取数据 2.3 关闭流 3.0 文件字节输出流(FileOutputStream) 3.1 创建 Fi…

浏览器生成Excel文件 ,Apache POI 使用方法及示例

Apache POI 是 Apache 软件基金会的开源项目&#xff0c;它提供 API 用于读取和写入 Microsoft Office 格式的文件&#xff0c;如 Excel、Word 等。在 Spring Boot 应用中&#xff0c;结合使用 Apache POI 可以方便地处理 Excel 文件 一 引入依赖&#xff1a; <dependency&…

【数据结构】顺序表:与时俱进的结构解析与创新应用

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 数据结构与算法 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数据结构的概念 二、顺序表&#xff08;Sequence List&#xff09; 2.1 线性表的概念以及结构 2.2 顺序表分类 …

计算机网络----第十三天

DNS协议和文件传输协议 DNS&#xff1a; 含义&#xff1a;用于域名和IP地址的互相解析 DNS域名&#xff1a; 背景&#xff1a;通过IP地址访问目标主机&#xff0c;不便于记忆 域名的树形层次化结构&#xff1a; ①根域 ②顶级域&#xff1a;主机所处的国家/区域&#xf…

【数据结构】霍夫曼树

1.概念 霍夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。在霍夫曼树中&#xff0c;叶子节点的权值通常代表字符出现的频率&#xff0c;非叶子节点的权值是其子节点权值的和。霍夫曼树广泛应用于数据压缩…