设计模式实验

发布时间 2023-11-27 09:13:16作者: 一个小虎牙

软件设计                  石家庄铁道大学信息学院

 

实验 21:观察者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解观察者模式的动机,掌握该模式的结构;

2、能够利用观察者模式解决实际问题。

 
   

 


[实验任务一]:股票提醒

当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。

实验要求:

1.     提交源代码;

 

package test21;

// 观察者接口,股民
interface Observer {
    void update(double price);
}

 

package test21;

// 具体观察者,股民
class StockInvestor implements Observer {
    private String name;

    public StockInvestor(String name) {
        this.name = name;
    }

    @Override
    public void update(double price) {
        if (price > 0) {
            System.out.println(name + "收到消息:股票价格上涨,赶紧买入!");
        } else {
            System.out.println(name + "收到消息:股票价格下跌,大哭一场!");
        }
    }
}

 

package test21;

// 主题接口,被观察的对象
interface Subject {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(double price);
}

 

package test21;

import java.util.ArrayList;
import java.util.List;

// 具体主题,股票价格
class StockPrice implements Subject {
    private double currentPrice;
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(double price) {
        for (Observer observer : observers) {
            observer.update(price);
        }
    }

    public void setPrice(double newPrice) {
        if ((newPrice - currentPrice)>= 0.05 * currentPrice) {
            currentPrice = newPrice;
            notifyObservers(currentPrice);
        }else {
            notifyObservers(-1);
        }
    }
}

 

package test21;

// 测试
public class Main {
    public static void main(String[] args) {
        StockPrice stockPrice = new StockPrice();

        StockInvestor investor1 = new StockInvestor("王某");
        StockInvestor investor2 = new StockInvestor("李某");

        stockPrice.addObserver(investor1);
        stockPrice.addObserver(investor2);

        // 模拟股票价格变化
       
stockPrice.setPrice(100.0);
        stockPrice.setPrice(1.0);
        stockPrice.setPrice(110.0);
    }
}

 

2.     提交类图;

 

 

3.     注意编程规范。