观察者模式

简介: 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。优点:1.观察者和被观察者是抽象耦合的缺点:1.目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。 2.当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。


定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

优点:1.观察者和被观察者是抽象耦合的

缺点:1.目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。

          2.当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

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

原理:在抽象类里有一个 ArrayList 存放观察者们。

类图:image.png

栗子

观察者做出相应行为的方法的接口

1. 
2. public interface Observer {
3. 
4. void update(Observable o);
5. 
6. }

观察者的实现类

1. public class ConcreteObserver1 implements Observer{
2. 
3. public void update(Observable o) {
4. System.out.println("观察者1做出相应");
5.     }
6. 
7. }
1. public class ConcreteObserver2 implements Observer{
2. 
3. public void update(Observable o) {
4. System.out.println("观察者2做出相应");
5.     }
6. 
7. }

被观察者

1. public class Observable {
2. 
3.     List<Observer> observers = new ArrayList<Observer>();
4. 
5. public void addObserver(Observer o){
6.         observers.add(o);
7.     }
8. 
9. public void changed(){
10.         System.out.println("我是被观察者,我已经发生变化了");
11.         notifyObservers();//通知观察自己的所有观察者
12.     }
13. 
14. public void notifyObservers(){
15. for (Observer observer : observers) {
16.             observer.update(this);
17.         }
18.     }
19. }

调用

1. public class Client {
2. 
3. public static void main(String[] args) throws Exception {
4. Observable observable = new Observable();
5.         observable.addObserver(new ConcreteObserver1());
6.         observable.addObserver(new ConcreteObserver2());
7. 
8.         observable.changed();
9.     }
10. }

 


相关文章
|
小程序 前端开发 测试技术
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
363 1
|
缓存 监控 Java
Spring Boot应用的性能监控与优化
Spring Boot应用的性能监控与优化
在Linux中,如何查看占用CPU最多的进程?
在Linux中,如何查看占用CPU最多的进程?
|
Kubernetes Ubuntu 应用服务中间件
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
4801 0
|
自然语言处理 PHP C语言
PHP的解析器是干什么的?底层原理是什么?
PHP的解析器是干什么的?底层原理是什么?
621 0
|
Android开发
Android EditText输入光标居于开头最开始位置
Android EditText输入光标居于开头最开始位置 Android的EditText输入光标默认是居于整个EditText的中心位置的,如图所示: 如果欲使EditText加载后的输入光标自动处于最开始处,可...
1329 0
|
10天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34578 26
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
4天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
4220 16
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
22天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45437 150
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
3天前
|
人工智能 机器人 开发工具
Windows 也能跑 Hermes Agent!完整安装教程 + 飞书接入,全程避坑
Hermes Agent 是一款自学习AI智能体系统,支持一键安装与飞书深度集成。本教程详解Windows下从零部署全流程,涵盖依赖自动安装、模型配置、飞书机器人接入及四大典型兼容性问题修复,助你快速构建企业级AI协作平台。(239字)
3769 10

热门文章

最新文章