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