设计模式-观察者模式
观察者模式的运用
(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%。