观察者模式的运用
(1)案例背景:
某在线股票系统需要提供以下功能:当股票购买者所购买的某只股票价格变化幅度达到 5%时,系统 将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计该系统,绘制类图并编程实 现
(2)实现步骤:
- Ø 根据题意,画出在线股票系统的类图,类图中应包括目标类 Stock,抽象观察者 Investor 以及具体 观察者 ConcreteInvestor。Stock 类中应该包含添加观察者的功能 attach(),移除观察者的功能 detach(),获取股票名称 getStockName(),设定股票名称 setStockName(),设定股票价格 setPrice(),获取股票功能 getPrice()以及通知观察者的功能 notifyInvestor();观察者应该 有能够根据观察目标的改变作出反应的 upDate()方法
- Ø 根据类图,实现上述类的具体代码以及用户类 Client。
- Ø 编译并运行程序,使得股民能够在价格变化超过 5%的时候收到通知。
(4)案例总结: 在以下情况可以使用观察者模式:
Ø 一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中 使它们可以各自独立地改变和复用
Ø 一个对象的改变将导致一个或多个其他对象发生改变,并且不知道具体有多少对象将发生改变, 也不知道这些对象是谁
Ø 需要在系统中创建一个触发链
代码结构:
详细代码:
Stock.java:
package Observer;
import java.util.ArrayList;
public class Stock {
protected ArrayList observers = new ArrayList();
String stockName;
int price;
public void attach(Investor investor){
observers.add(observers);
}
public void detach(Investor investor){
observers.remove(observers);
}
public String getStockName() {
return stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public void notifyInvestor(){
System.out.println("通知:价格变化超过5%!");
System.out.println("----------------");
for (Object obs:observers){
((Investor)obs).upDate();
}
}
}
Investor.java:
package Observer;
public interface Investor {
void upDate();
}
ConcreateInvestor.java:
package Observer;
public class ConcreateInvestor implements Investor{
public void upDate(){
System.out.println("价格变化超过5%!");
}
}
Clent.java:
package Observer;
public class Client {
public static void main(String[] args) {
System.out.println("详细设计实验报告 1904班白旭君 2019005368");
Stock stock1 = new Stock();
Stock stock2 = new Stock();
// String stockName;
// int price;
Investor investor1 = new ConcreateInvestor();
Investor investor2 = new ConcreateInvestor();
stock1.attach(investor1);
stock1.setPrice(49);
stock1.setStockName("股票1");
stock1.setPrice(50);
stock2.attach(investor2);
stock2.setPrice(49);
stock2.setStockName("股票2");
stock2.setPrice(100);
if ((stock1.getPrice() >= 49 * 1.05 ) || (stock1.getPrice() <= 49 * 0.95) ){
System.out.print(stock1.getStockName());
investor1.upDate();
}
if ((stock2.getPrice() >= 49 * 1.05 ) || (stock2.getPrice() <= 49 * 0.95) ){
System.out.print(stock2.getStockName());
investor2.upDate();
}
// investor1.setStockName("股票1");
// investor1.setPrice(50);
//
// investor2.setStockName("股票2");
// investor2.setPrice(90);
//
// Stock.attach(stock1);
}
}
实验结果:
股票1,股票2原本的price都为49.之后将股票1setprice为50,股票2setprice为100,显然,股票2增长超过5%,所以给股民提示:股票2变化超过5%。