写点什么

设计模式的艺术 第二十二章观察者设计模式练习(开发一款实时在线股票软件。该软件需要提供如下功能:当股票购买者所购买的某只股票价格变化幅度达到 5% 时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。试使用观察者模式设计并实现该系统)

作者:代廉洁
  • 2022 年 9 月 05 日
    浙江
  • 本文字数:1660 字

    阅读完需:约 5 分钟

Sunny 软件公司欲开发一款实时在线股票软件。该软件需要提供如下功能:当股票购买者所购买的某只股票价格变化幅度达到 5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。试使用观察者模式设计并实现该系统。


一、类结构图



抽象观察目标类:设计为名称为 Stock 的抽象类,面向抽象观察者类编程,持有一个抽象观察者类的列表,包含具体方法 addBuyer(Buyer buyer)、具体方法 removeBuyer(Buyer buyer)、具体方法 setPrice(Double price)、具体方法 changePrice(Double price)、抽象方法 notify();

抽象观察者类:设计为名称为 Buyer 的抽象类,面向抽象观察目标类编程,包含具体方法 setName(String name)、抽象方法 focus(Stock stock);

具体观察目标类:设计为抽象观察目标类的子类,设计为名称为 ConcreteStock 的具体类,实现抽象方法 notify();

具体观察者类:设计为抽象观察者类的子类,设计为名称为 ConcreteBuyer 的具体类,实现抽象方法 focus(Stock stock)。


二、典型实现代码

抽象股票类:抽象观察目标类
// 抽象股票类:抽象观察目标类public abstract class Stock {    private String name;    private Double price;    protected List<Buyer> buyerList = new ArrayList<>();
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Double getPrice() { return price; }
public void setPrice(Double price) { this.price = price; } public void addBuyer(Buyer buyer) { this.buyerList.add(buyer); }
public void removeBuyer(Buyer buyer) { this.buyerList.remove(buyer); }
public void changePrice(Double price) { Double absGap = Math.abs(price - this.price); Double changePercent = new BigDecimal(absGap).divide(new BigDecimal(this.price), 4,BigDecimal.ROUND_HALF_UP).doubleValue(); this.price = price; if (changePercent >= 0.05) { nofityBuyer(); } }
public abstract void nofityBuyer();}
复制代码


抽象买家类:抽象观察者类
// 抽象买家类:抽象观察者类public abstract class Buyer {    protected String name;
public Buyer(String name) { this.name = name; }
public abstract void focus(Stock stock);}
复制代码


具体股票类:具体观察目标类
// 具体股票类:具体观察目标类public class ConcreteStock extends Stock {    @Override    public void nofityBuyer() {        for (Buyer buyer : buyerList) {            buyer.focus(this);        }    }}
复制代码


具体买家类:具体观察者类
// 具体买家类:具体观察者类public class ConcreteBuyer extends Buyer {
public ConcreteBuyer(String name) { super(name); }
@Override public void focus(Stock stock) { System.out.println(this.name + "关注的" + stock.getName()+ "的股价发生变化,现价" + stock.getPrice()); }}
复制代码


客户端代码:
public class Client {    public static void main(String[] args) {        Stock concreteStock;        concreteStock = new ConcreteStock();        concreteStock.setName("股票一");        concreteStock.setPrice(10.53);
Buyer concreteBuyer1, concreteBuyer2; concreteBuyer1 = new ConcreteBuyer("股民一"); concreteBuyer2 = new ConcreteBuyer("股民二");
concreteStock.addBuyer(concreteBuyer1); concreteStock.addBuyer(concreteBuyer2); concreteStock.changePrice(11.00); concreteStock.changePrice(12.00); }}
复制代码


编译并运行程序,输出如下结果:
股民一关注的股票一的股价发生变化,现价12.0股民二关注的股票一的股价发生变化,现价12.0
复制代码


发布于: 刚刚阅读数: 5
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第二十二章观察者设计模式练习(开发一款实时在线股票软件。该软件需要提供如下功能:当股票购买者所购买的某只股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。试使用观察者模式设计并实现该系统)_代廉洁_InfoQ写作社区