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

实验2-代理模式和观察者模式设计

一、实验目的
1、学习StarUML软件,掌握类图绘制方法。

2、利用java实现代理模式和观察者模式。

二、实验内容

1.代理模式设计与实现:  应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法。

(1)代码

图1 Subject.java

图2 Picture.java

图3 Application.java

图4 Client.java

(3)实验结果

图5 实验结果

2观察者模式设计与实现:  某在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。

(1)代码

图6 Subject.java

图7 Stock.java

图8 Observer.java

图9 Investor.java

图10 Client.java

(3)实验结果

图11 实验结果

三、思考题

1、代理模式与观察者模式各自的特征是什么?区别是什么?

代理模式特征:

(1)核心思想:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

(2)模式结构:抽象主题角色(Subject)、代理主题角色(Proxy)和真实主题角色(RealSubject)。

(3)优点:远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。保护代理可以控制对真实对象的使用权限。

(4)缺点:有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

观察者模式特征:

(1)核心思想:定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

(2)模式结构:目标(Subject)、具体目标(ConcreteSubject)、观察者(Observer)和具体观察者(ConcreteObserver)。

(3)优点:实现表示层和数据逻辑层的分离,并定义稳定的消息更新传递机制,抽象更新接口,使得可以有各种不同的表示层作为具体观察者角色。支持广播通信。

(4)缺点:如果观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

区别:

代理模式强调的是“控制访问”和“增强功能”,关注点在于一个对象对另一个对象的代理行为;而观察者模式强调的是“通知机制”和“对象间的通信”,关注点在于多个观察者如何响应被观察者的状态变化。

2、代理模式和观察者模式各适用于什么类型的软件设计?

代理模式适用场景:

(1)远程代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中。

(2)虚拟代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

(3)代理模式适用于需要控制对某个对象访问的场景,比如远程方法调用、安全控制、延迟加载、缓存优化等场合,典型如虚拟代理、保护代理、智能引用等。

观察者模式适用场景:

(1)抽象模型有两个方面,其中一个方面依赖于另一个方面。

(2)一个对象必须通知其他对象,而并不知道这些对象是谁。

(3)需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象.,可以使用观察者模式创建一种链式触发机制。

(4)凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式。

(5)观察者模式适用于事件驱动型软件、状态联动系统、需要解耦发布者和订阅者的设计中,典型如图形界面系统中的事件监听器、消息推送系统、数据变化通知机制等。

http://www.dtcms.com/a/362655.html

相关文章:

  • 实验1-工厂方法和抽象工厂模式
  • C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)
  • 支付系统设计模式应用:从单例到观察者模式实践
  • 普通大学生的 Web3 实习怎么找?行业指南与实践技巧这里看
  • ArkUI核心功能组件使用(一)
  • ChatDOC工具测评:AI驱动PDF/Word文档处理,支持敏感内容隐私保护与表格提取分析
  • 一文吃透 deviceQuery:从安装到输出解读,彻底验证服务器 GPU 环境
  • Elasticsearch 核心知识与常见问题解析
  • 【学Python自动化】 7.1 Python 与 Rust 输入输出对比学习笔记
  • Dell 服务器更新Infiniband网卡固件操作
  • 大模型适配国产化服务器昇腾(300I DUO)
  • 信创服务器总死机原因及解决办法
  • 通过 FinalShell 访问服务器并运行 GUI 程序,提示 “Cannot connect to X server“ 的解决方法
  • 【技术教程】如何将文档编辑器集成至基于Node.js的网页应用程序中
  • Babylon 编辑器快捷键小记
  • 临时邮箱地址获取服务器邮件工作流程与实现
  • Coze源码分析-工作空间-资源查询-后端源码
  • vue2滑块验证
  • 2025年IT行业女性职业发展证书选择指南
  • 从零开始在Ubuntu上快速部署Docker和Dify:结合 Dify + 蓝耘 MaaS平台打造 AI 应用实战指南
  • 网络准入控制,阻断违规外联-企业内网安全的第一道防线
  • 2025 随身 WIFI 行业报告:从拼参数到重体验,华为 / 格行 / 中兴技术差异化路径解析
  • 华为HCIE认证:三年有效期值不值得?
  • 腾讯会议的最佳替代者:Jitsi Meet 安装指南-支持onlyoffice集成
  • 第三方软件测试机构【多语言开发(PHP/Java/Python)WEB 应用的安全专业测试流程】
  • 【图像处理基石】图像预处理方面有哪些经典的算法?
  • Leetcode_206.反转链表(递归)
  • 学习日记-SpringMVC-day48-9.2
  • JS 秒转换成 MM:SS 格式
  • leetcode算法刷题的第二十四天