观察者模式

实验 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. 注意编程规范。

 

 

posted @   chrisrmas、  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示