《设计模式精解》学习笔记(十三)------Observer(观察者)模式

来源:互联网 发布:vwap算法 编辑:程序博客网 时间:2024/05/01 18:49

《设计模式精解》学习笔记(十三)------Observer(观察者)模式

 

GoFObserver模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。

 

举个例子:一般在炒股票的时候人们总是紧盯着大盘的起伏涨跌。根据某支股票的涨跌来决定买进或抛出。而在整个交易中紧盯着大盘的这个人就是一个观察着。他将观察的结果通知他的亲属朋友,或自己做出决定去交易。Observer模式是如此的有用,以至于在JavaJDK包当中容纳了Observer模式的一个实现版本。Observable类和Observer接口组成了这个模式。关于Observable类和Observer接口在JDK的帮助文档中有详细的介绍。在Observer模式的学习过程中,我运用了JDK中的Observable类和Observer接口来实现了Observer模式的代码。

 

下面是Observer模式的UML图:

上图我画的不是很规范,但是已经表达出了Observer模式。

 

下面是实例代码:

package Observer;

 

import java.util.Observable;

 

public class Stock extends Observable //继承Observable

{

       private String stockName;

       private float stockPrice;

       private int stockId;

      

       public Stock(int id, String name, float price)//设定初始状态

       {

              this.stockId = id;

              this.stockName = name;

              this.stockPrice = price;

       }//end Stock(...)

      

       public String getName()

       {

              return stockName;

       }//end getName()

      

       public float getPrice()

       {

              return stockPrice;

       }//end getPrice()

      

       public int getId()

       {

              return this.stockId;

       }//end getId()

      

       public void setName(String name)

       {

              this.stockName = name;

              setChanged(); //名称已经改变

              notifyObservers("stockName"); //

       }//end setName(...)

      

       public void setPrice(float price)

       {

              this.stockPrice = price;

              setChanged();

              notifyObservers("stockPrice");

       }//end setPrice(...)

      

}//end class Stock

 

package Observer;

 

import java.util.Observable;

import java.util.Observer;

 

public class NameObserver implements Observer

{

       public void update(Observable obj, Object arg)

       {

              try{

                     if(arg instanceof String){

//                          System.out.println("arg333 = " + arg);

                            String argName = (String)arg;

//                          System.out.println("argName = " + argName);

                            if(argName.trim().equalsIgnoreCase("stockName")){

//                                 System.out.println("name here");

                                   int id = 0;

                                   String name = "";

                                   if(obj instanceof Stock){

                                          Stock sto = (Stock)obj;

                                          name = sto.getName();

                                          id = sto.getId();

                                   }

                                   System.out.println("NameObserver: Stock " + id + "'s name has changed to " + name);

                            }

                     }

              }catch(Exception e){

                     e.printStackTrace();

              }

       }//end update(...)

      

}//end class NameObserver

 

package Observer;

 

import java.util.Observable;

import java.util.Observer;

 

public class PriceObserver implements Observer

{

       public void update(Observable obj, Object arg)

       {

              try{

                     if(arg instanceof String){

                            String argName = (String)arg;

                            if(argName.trim().equalsIgnoreCase("stockPrice")){

                                   int id = 0;

                                   float price = 0.0f;

                                   if(obj instanceof Stock){

                                          Stock sto = (Stock)obj;

                                          price = sto.getPrice();

                                          id = sto.getId();

                                   }

                                   System.out.println("PriceObserver: Stock " + id + "'s price has changed to " + price);

                            }

                     }

              }catch(Exception e){

                     e.printStackTrace();

              }

       }//end update(...)

      

}//end class PriceObserver

 

测试代码:

package Observer;

 

public class ObserverPattern

{

       private Stock stock;//实例化一个股票对象

      

       private NameObserver stockName; //实例化一个观察股票名称的对象

       private PriceObserver stockPrice;//实例化一个观察股票价格的对象

      

       public ObserverPattern()//初始化类成员

       {

              stock = new Stock(1, "海南椰岛", 2.92f);//初始一支股票的名称和价格

              stockName = new NameObserver();

              stockPrice = new PriceObserver();

       }//end ObserverPattern()

      

       public void showHowToObserver()

       {

              stock.addObserver(stockName);

              stock.addObserver(stockPrice);

             

//            stock.setName("/"百度/"");//重新设置股票的名称

              stock.setPrice(123.98f);//重新设置股票的价格

//            System.out.println("");

//            stock.setName("/"Google/"");//再次设置股票的名称

              stock.setPrice(234.87f);//再次设置股票的价格

             

       }//end showHowToObserver()

      

       public static void main(String[] args)

       {

              System.out.println("The observer pattern!");

              ObserverPattern op = new ObserverPattern();

              op.showHowToObserver();

       }//end main(...)

 

}//end class ObserverPattern

 

Observer模式充分体现了OO的特性,理解了Observer模式能更好的理解OO思想。

 

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=954048

 
原创粉丝点击