当前位置: 首页 > news >正文

观察者模式概述

观察者模式,它用于建立一种对象与对象之间的依赖关系,
一个对象发生改变将自动通知其他对象,
其他对象将相应做出反应。在观察者模式种,发生改变的对象称为观察目标,
而被通知的对象称为观察者,一个观察目标可以对应多个观察者,
而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,
使得系统易于扩展。

观察者模式(Observer Pattern)定义对象之间的一种一对多依赖关系,
使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式的别名包括发布-订阅模式、模型-试图模式、
源-监听器模式或从属者模式。观察者模式是一种对象行为模式。
Subject(目标):目标又称为主题,
它是指被观察的对象。在目标中定义了一个观察者集合,
一个观察目标可以接受任意数量的观察者来观察,
它提供一系列方法来增加和删除观察者对象,
同时它定义了通知方法notify()。
目标类可以是接口,也可以是抽象类或具体类。

ConcreteSubject(具体目标):
具体目标是目标类的子类,通常它包含又经常发生改变的数据,
当他的状态发生改变时,向它的各个观察者发出通知;
同时它还实现了在目标类中定义的抽象业务逻辑方法
(如果有的话)。如果无需扩展目标类,则具体目标类可以省略。

Observer观察者:
观察者将对观察目标的改变做出反应,
观察者一般定义为接口,改接口声明了更新数据的方法
update(),因此又称为抽象观察者。

ConcreteObserver具体观察者:
在具体观察者中维护一个指向具体目标对象的引用,
它存储具体观察者的有关状态,
这些状态需要和具体目标的状态保持一致。
它实现了在抽象观察者Observer中定义的
update方法。通常在实现时,可以调用具体目标类的
attach方法将自己添加到目标类的集合中或通过detach()
方法将自己从目标类的集合中删除。

观察模式描述了如何建立对象于对象之间的依赖关系,
以及如何构造满足这种需求的系统。
观察者模式包含观察目标和观察者两类对象,
一个目标可以有任意数目的与之相依赖的观察者,
一旦观察目标的状态发生改变,所有的观察者都将得到通知。
作为对这个通知的响应,每个观察者都将监听观察目标的状态
以使其状态与目标状态同步,这个交互也称为发布-订阅。
Publish-Subject。观察目标是通知的发布者。
它发出通知并不需要知道谁是它的观察者,可以有任意数目的观察者订阅
它并接收通知。

public class Main{public static void main(String[] args) {/*观察者模式*/Subject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver1();Observer observer2 = new ConcreteObserver2();subject.add(observer1);subject.add(observer2);subject.notifyObserver();}}
public abstract class Subject {//定义一个观察集合用于存储所有观察集合。protected ArrayList<Observer> observers = new ArrayList<Observer>();//protected ArrayList <observers> Observer = new ArrayList<>();//向观察集合插入一个观察者public void add(Observer observer){observers.add(observer);}//向观察集合删除一个观察者public void detach(Observer observer){observers.remove(observer);}//声明抽象通知方法public abstract void notifyObserver();}
public interface Observer {public void update();
}
public class ConcreteSubject extends Subject{@Overridepublic void notifyObserver() {// 实现通知方法for(Object obs:observers){//遍历观察者集合,调用每一个观察者的响应方法((Observer)obs).update();}}
}
public class ConcreteObserver1 implements Observer{@Overridepublic void update() {System.out.println("具体观察者1作出反应!");}
}
public class ConcreteObserver2 implements Observer{@Overridepublic void update() {System.out.println("具体观察者2作出反应!");}
}

具体观察者1作出反应!
具体观察者2作出反应!

相关文章:

  • 基于rk3568 Android H265推流SRS低延迟网页播放方案
  • Node.js--》node环境配置及nvm和nvm-desktop安装教程
  • 数字IC设计流程
  • MongoDB 数据类型
  • WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉
  • Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系
  • Python入门学习篇(十四)——模块文件操作
  • java之树筛选
  • 判断电话号码是否重复-excel
  • x-cmd pkg | openssl - 密码学开源工具集
  • 【JavaFX】基于JavaFX11 构建可编辑、对象存储、修改立即保存、支持条件过滤的TableView
  • LeetCode976. Largest Perimeter Triangle
  • docker +gitee+ jenkins +maven项目 (一)
  • C语言 指针初阶
  • 【Redis-08】Redis主从复制的实现原理
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【个人向】《HTTP图解》阅后小结
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • es6
  • exif信息对照
  • JavaScript创建对象的四种方式
  • Java多线程(4):使用线程池执行定时任务
  • jQuery(一)
  • Js基础知识(一) - 变量
  • Koa2 之文件上传下载
  • mac修复ab及siege安装
  • Mysql优化
  • springboot_database项目介绍
  • 初识 webpack
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 近期前端发展计划
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 判断客户端类型,Android,iOS,PC
  • 前端
  • 如何实现 font-size 的响应式
  • 用Canvas画一棵二叉树
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在Unity中实现一个简单的消息管理器
  • 智能网联汽车信息安全
  • 积累各种好的链接
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #考研#计算机文化知识1(局域网及网络互联)
  • (1)bark-ml
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (学习日记)2024.01.19
  • (转)LINQ之路
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .net MySql
  • .net 调用php,php 调用.net com组件 --
  • .NET 服务 ServiceController
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net环境下的缓存技术介绍