ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-观察者模式

2022-04-23 17:34:49  阅读:183  来源: 互联网

标签:void 观察者 模式 stock1 设计模式 Investor public Stock


观察者模式的运用

 (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%

 

 

 

标签:void,观察者,模式,stock1,设计模式,Investor,public,Stock
来源: https://www.cnblogs.com/lysboke/p/16182977.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有