24.12.14
實驗 21:觀察者模式
本次實驗屬于模仿型實驗,通過本次實驗學生將掌握以下內容:
1、理解觀察者模式的動機,掌握該模式的結構;
2、能夠利用觀察者模式解決實際問題。
[實驗任務一]:股票提醒
當股票的價格上漲或下降5%時,會通知持有該股票的股民,當股民聽到價格上漲的消息時會買股票,當價格下降時會大哭一場。
實驗要求:
1. 畫出對應類圖;
2. 提交源代碼;
3. 注意編程規范。
- 類圖:

- 源代碼:
import java.util.ArrayList;
import java.util.List;
// 觀察者接口
interface Observer {
void update(String stockName, double oldPrice, double newPrice);
}
// 被觀察者接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// Stock類 (被觀察者)
class Stock implements Subject {
private String name;
private double price;
private List<Observer> observers;
private double previousPrice;
public Stock(String name, double price) {
this.name = name;
this.price = price;
this.previousPrice = price;
observers = new ArrayList<>();
}
public void setPrice(double newPrice) {
this.previousPrice = this.price;
this.price = newPrice;
if (Math.abs((newPrice - previousPrice) / previousPrice) >= 0.05) {
notifyObservers();
}
}
public double getPrice() {
return price;
}
public String getName() {
return name;
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(name, previousPrice, price);
}
}
}
// Stockholder類 (觀察者)
class Stockholder implements Observer {
private String name;
public Stockholder(String name) {
this.name = name;
}
@Override
public void update(String stockName, double oldPrice, double newPrice) {
System.out.println("股民 " + name + " 收到通知:股票 " + stockName + " 價格從 " + oldPrice + " 變為 " + newPrice);
if (newPrice > oldPrice) {
System.out.println(name + ":價格上漲,買入股票!");
} else {
System.out.println(name + ":價格下跌,大哭一場!");
}
System.out.println("---------------------------");
}
}
// 測試類
public class Client {
public static void main(String[] args) {
Stock stock = new Stock("ABC", 100.0);
Stockholder s1 = new Stockholder("張三");
Stockholder s2 = new Stockholder("李四");
stock.registerObserver(s1);
stock.registerObserver(s2);
// 模擬股票價格變動
System.out.println("第一次價格變動:");
stock.setPrice(105.0); // 漲 5%
System.out.println("第二次價格變動:");
stock.setPrice(95.0); // 跌 10%
System.out.println("第三次價格變動:");
stock.setPrice(90.0); // 跌 5%
System.out.println("第四次價格變動:");
stock.setPrice(110.0); // 漲 22%
}
}
浙公網安備 33010602011771號