设计模式-观察者模式

观察者模式的运用

 (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.之后将股票1setprice50,股票2setprice100,显然,股票2增长超过5%,所以给股民提示:股票2变化超过5%

 

 

 
posted @ 2022-04-23 17:19  临易  阅读(526)  评论(0编辑  收藏  举报