24.11.27
[实验任务一]:股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
实验要求:
-
画出对应类图;
-
提交源代码;
package org.test.ruanjiansheji.guanchazhe;
import java.util.ArrayList;
import java.util.List;
// 抽象观察者接口
interface Observer {
void update(String stockName, double priceChange);
}
// 具体观察者类(股民)
class StockHolder implements Observer {
private String name;
public StockHolder(String name) {
this.name = name;
}
@Override
public void update(String stockName, double priceChange) {
if (priceChange > 0) {
System.out.println(name + " 听到 " + stockName + " 上涨了 " + String.format("%.2f", priceChange) + "%,开心地买入股票!");
} else {
System.out.println(name + " 听到 " + stockName + " 下跌了 " + String.format("%.2f", Math.abs(priceChange)) + "%,伤心地大哭一场!");
}
}
}
// 被观察者类(股票)
class Stock {
private String name;
private double price;
private List
public Stock(String name, double price) {
this.name = name;
this.price = price;
}
// 添加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
// 移除观察者
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 通知观察者
private void notifyObservers(double priceChange) {
for (Observer observer : observers) {
observer.update(name, priceChange);
}
}
// 更新股票价格
public void updatePrice(double newPrice) {
double priceChangePercentage = ((newPrice - this.price) / this.price) * 100;
this.price = newPrice;
// 如果涨跌幅大于等于5%,通知观察者
if (Math.abs(priceChangePercentage) >= 5) {
notifyObservers(priceChangePercentage);
}
}
}
// 测试类
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建股票
Stock stock = new Stock("TechCorp", 100);
// 创建股民(观察者)
StockHolder holder1 = new StockHolder("张三");
StockHolder holder2 = new StockHolder("李四");
// 添加观察者
stock.addObserver(holder1);
stock.addObserver(holder2);
// 模拟价格变化
stock.updatePrice(105); // 涨幅 5%
stock.updatePrice(95); // 跌幅 5%
stock.updatePrice(90); // 跌幅 10%
}
}
- 注意编程规范。