java 观察者模式

news/2025/1/16 2:46:33/

观察者模式

    • 观察者模式简介
    • 观察者模式的实现
    • 总结

观察者模式简介

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。


观察者模式的实现

观察者模式的主要角色如下:

抽象主题(Subject)角色: 也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
具体主题(Concrete Subject)角色: 也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
抽象观察者(Observer)角色: 它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
具体观察者(Concrete Observer)角色: 实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

抽象观察者Observer:

abstract class Observer
{public abstract void Update();
}

抽象主题Subject:

public abstract class Subject
{//增加观察者public abstract void Attach(Observer observer);//移除观察者public abstract void Detach(Observer observer);//通知public abstract void Notify();
}

具体主题ConcreteSubject:

class ConcreteSubject extends Subject{//被观察者的状态private String subjectState;private List<Observer> observers = new ArrayList<Observer>();public String getSubjectState() {return subjectState;}public void setSubjectState(String subjectState) {this.subjectState = subjectState;}@Overridepublic void Attach(Observer observer) {observers.add(observer);}@Overridepublic void Detach(Observer observer) {observers.remove(observer);}@Overridepublic void Notify(){for(Observer item:observers){item.Update();}}
}

具体观察者ConcreteObserver:

public class ConcreteObserver extends Observer{private String name;private String observerState;private ConcreteSubject subject;public ConcreteObserver(String name, ConcreteSubject subject) {this.name = name;this.subject = subject;}@Overridepublic void Update() {observerState=subject.getSubjectState();System.out.println("观察者"+name+"的新状态是:"+observerState);}public ConcreteSubject getSubject() {return subject;}public void setSubject(ConcreteSubject subject) {this.subject = subject;}}

测试:

public static void main(String[] args) {//被观察者ConcreteSubject cs=new ConcreteSubject();//为cs增加三个观察者cs.Attach(new ConcreteObserver("x",cs));cs.Attach(new ConcreteObserver("y",cs));cs.Attach(new ConcreteObserver("z",cs));//cs发生变化cs.setSubjectState("ss");cs.Notify();}
观察者x的新状态是:ss
观察者y的新状态是:ss
观察者z的新状态是:ss

总结

主要优点:

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

主要缺点:

  • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
  • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

观察者模式的应用场景如下:

  • 一个对象的数据或状态更新需要其它对象同步更新时;
  • 系统存在事件多级触发时;
  • 一个对象仅需要将自己的更新通知给其它对象而不需要知道其它对象细节时,如消息推送;
  • 跨系统的消息交换场景,如通信过程中的消息队列处理机制

http://www.ppmy.cn/news/1069906.html

相关文章

Linux 指令心法(二)`cd` 更改当前目录

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 cd 是 “Change Directory” 的缩写。这是一个 shell 内建命令&#xff0c;用于在 Linux 和 Unix 系统中改变当前工作目录。通过使用 cd 命令&#xff0c;用户…

vue2中使用wangEditor(JS引入)

本文讲的不是npm安装&#xff0c;是下载js本地引入哦~ 想了解vue2和vue3的npm安装的&#xff0c;去这里&#xff1a;用于 Vue React | wangEditor 为了防止内网无法使用&#xff0c;咱不用cdn引入&#xff0c;直接下载js放入本地使用。 第一步&#xff1a;下载wangEditor对应…

servlet内存马学习

项目配置 注意一定要添加 否则访问路径会404&#xff0c;tomcat并没有对项目生效 1.实现javax.servlet.Servlet接口的方式 Servlet.class&#xff1a; package org.test;import javax.servlet.*; import java.io.IOException;public class ServletTest implements Servle…

go gin 自定义验证

我们上一篇已经提到了gin中binding时候可以指定json字段大小等限制&#xff0c;但是那个错误却是英文的&#xff0c;现在想搞成中文的&#xff0c;以便前端可读&#xff0c;demo如下 package mainimport ("net/http""reflect""github.com/gin-gonic/…

使用亥姆霍兹线圈的注意事项

亥姆霍兹线圈由一对完全相同的圆形导体线圈组成。采用直角坐标系&#xff0c;两个半径为R的圆形线圈的中心轴与z轴同轴。两个圆形线圈的z坐标分别为和。每个导体线圈都有相同的电流I。 设置可以减少两个线圈中心O(即原点)的磁场不均匀性。这种动作促使&#xff0c;也意味着非零…

【Leetcode】P1 两数之和.py(未完待续)

题目描述 已知&#xff1a; 整数数组&#xff1a; n u m s nums nums整数目标值&#xff1a; t a r g e t target target 要求&#xff1a; 要求在 n u m s nums nums 数组中找到和的值为 t a r g e t target target 的两个整数 返回&#xff1a; 返回两个整数的数组下…

Unity记录4.4-存储-系统数据以配置文件保存

文章首发见博客&#xff1a;https://mwhls.top/4818.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 汇总&#xff1a;Unity 记录 摘要&#xff1a;处处修改->一处修改的系统配置文件。 思路-2023/08/…

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…