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

实验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.xdnf.cn/news/19633.html

相关文章:

  • C++全局变量未初始的和已初始化的位置放在哪里?
  • C语言————实战项目“扫雷游戏”(完整代码)
  • 【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南
  • MD5加密算法详解与实现
  • 【LeetCode_26】删除有序数组中的重复项
  • 手撕Redis底层2-网络模型深度剖析
  • 云电脑是什么?与普通电脑的区别在哪里?——天翼云电脑体验推荐
  • 全国产FT-M6678核心板
  • SQL JOIN 操作全面解析
  • 哈希表-面试题01.02.判定是否互为字符重排-力扣(LeetCode)
  • 【LeetCode数据结构】栈和队列的应用
  • 在windows平台oracle 23ai 数据库上使用bbed
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • 【Vue2 ✨】 Vue2 入门之旅(六):指令与过滤器
  • 阿里云和华为云Rocky LINUX 9.X镜像就绪及低端可用英伟达GPU
  • Google NotebookLM最强替代品评测:AI笔记、语音生成与高效知识管理工具盘点
  • 【Linux基础知识系列:第一百一十八篇】使用perf进行性能分析
  • Day33 网络编程:OSI/TCP/IP模型、协议族与UDP编程
  • 【新启航】3D 逆向抄数的三维能力架构:数据采集工具操作 × 几何处理算法应用 × 行业场景适配技能
  • 微硕WINSOK大功率MOS管 WSF3085在汽车关键系统中的创新应用
  • 【世纪龙科技】汽车专业数字化课程资源包-虚拟仿真实训资源建设
  • 2025大学生必考互联网行业证书排名​
  • Nginx 全攻略:从部署到精通的实战指南(CentOS 环境)
  • 腾讯混元世界模型Voyager开源:单图生成3D世界的“核弹级”突破,游戏、VR、自动驾驶迎来新变量
  • Nature | 克隆拷贝数多样性影响肺癌生存
  • 大模型适配国产化服务器昇腾(300I DUO)
  • 多人语音分离模型效果展示与本地部署实践
  • spring boot启动
  • CAN诊断箱调试报告