24.11.27

[实验任务一]:股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
实验要求:

  1. 画出对应类图;
    image

  2. 提交源代码;
    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 observers = new ArrayList<>();

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%
}

}

  1. 注意编程规范。
posted @ 2024-11-27 20:38  起名字真难_qmz  阅读(8)  评论(0)    收藏  举报