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

相关推荐
猷咪5 分钟前
C++基础
开发语言·c++
IT·小灰灰6 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧8 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q9 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳09 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾9 分钟前
php 对接deepseek
android·开发语言·php
vx_BS8133013 分钟前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_9498683613 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计26 分钟前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
qq_1777673738 分钟前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos