观察者模式
实验 21:观察者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解观察者模式的动机,掌握该模式的结构;
2、能够利用观察者模式解决实际问题。
[实验任务一]:股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
实验要求:
1. 画出对应类图;
2. 提交源代码;
import java.util.ArrayList;
import java.util.List;
// 抽象主题接口
interface StockSubject {
double getPrice();
void setPrice(double price);
void attach(StockObserver observer);
void detach(StockObserver observer);
void notifyObservers();
}
// 具体主题类,代表某只股票
class ConcreteStock implements StockSubject {
private double price;
private List<StockObserver> observers = new ArrayList<>();
@Override
public double getPrice() {
return price;
}
@Override
public void setPrice(double price) {
this.price = price;
if (Math.abs((this.price - getOriginalPrice()) / getOriginalPrice()) >= 0.05) {
notifyObservers();
}
}
private double getOriginalPrice() {
// 假设这里有获取原始价格的逻辑,比如从数据库等,这里简单返回一个初始值示例
return 100.0;
}
@Override
public void attach(StockObserver observer) {
observers.add(observer);
}
@Override
public void detach(StockObserver observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (StockObserver observer : observers) {
observer.update(this);
}
}
}
// 抽象观察者接口
interface StockObserver {
void update(StockSubject stock);
}
// 具体观察者类,代表具体的股民
class ConcreteInvestor implements StockObserver {
private String name;
public ConcreteInvestor(String name) {
this.name = name;
}
@Override
public void update(StockSubject stock) {
double priceChange = (stock.getPrice() - stock.getOriginalPrice()) / stock.getOriginalPrice();
if (priceChange > 0) {
System.out.println(name + "听到股票价格上涨的消息,决定购买股票。");
} else {
System.out.println(name + "听到股票价格下降的消息,大哭一场。");
}
}
public String getName() {
return name;
}
}
public class StockReminderTest {
public static void main(String[] args) {
// 创建一只股票
ConcreteStock stock = new ConcreteStock();
// 创建几个股民
ConcreteInvestor investor1 = new ConcreteInvestor("张三");
ConcreteInvestor investor2 = new ConcreteInvestor("李四");
// 股民关注股票
stock.attach(investor1);
stock.attach(investor2);
// 设置股票价格,模拟价格变化触发通知
stock.setPrice(105.0);
stock.setPrice(95.0);
}
}
3. 注意编程规范。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统