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
复制代码
评论