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

相关推荐
KYGALYX5 分钟前
服务异步通信
开发语言·后端·微服务·ruby
zmzb010311 分钟前
C++课后习题训练记录Day98
开发语言·c++
爬山算法1 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7251 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎1 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄1 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
YUJIANYUE1 小时前
PHP纹路验证码
开发语言·php
忆~遂愿1 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds1 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹2 小时前
【Java基础】多态 | 打卡day2
java·开发语言