┆ 回首页
 
站内资源搜索:
┆ 将本文寄给朋友  

设计模式之Observer——公交篇

 

 

 


〖 作者:GaryFeng 〗〖 大小:20k 〗〖 发布日期:2006-04-07 〗〖 浏览:675 〗

 

     说到公交车,我想大家都不陌生吧,坐过公交车的朋友可能都知道,一般公交车上都有售票员(BusConductor),当然无人售票车要除外了。售票员(BusConductor)除了收取乘客(Passenger)的车费还起着监控的作用。
下面让我们看看这个过程该如何实现呢?

1、我们先定义售票员(BusConductor)接口类:

public interface BusConductor {
  public void getCurrentPassenger(Passenger passenger);  //获得当前乘客情况
}


2、再定义对售票员(BusConductor)接口的具体实现:
public class ConcreteBusConductor implements BusConductor{
  private Vector vectorBus;  //公交车vectorBus
  private Passenger passenger;
  public ConcreteBusConductor(Passenger passenger) {
    this.passenger=passenger;
  }
  public void getCurrentPassenger(Passenger passenger) {
      vectorBus = passenger.getCurrentPassenger();  //获得当前的乘客情况
      for(int i = 0; i < vectorBus.size(); i++) {
          System.out.println("公交车上有:" + (String)vectorBus.get(i));
      }
  }
  public void findPassengerChange(String action, String str) { //公交车乘客变化
      passenger.setCurrentPassenger(action, str);
  }
  public void observeResult() {  //观察到的情况
      passenger.showPassengerInfo();
  }
 
}

3、定义乘客(Passenger)接口类:

public interface Passenger {
  public abstract void attach(BusConductor busConductor);  //将乘客和售票员关联起来
 
  public abstract void  showPassengerInfo();  //传递乘客情况
 
  public abstract Vector getCurrentPassenger();  //获得当前乘客情况
 
  public abstract void  setCurrentPassenger(String act, String str);  //设置当前乘客情况
}


4、定义对乘客(Passenger)接口的具体实现:

public class ConcretePassenger implements Passenger{
  private List observerList; //观察者列表
  private Vector vectorBus;  //公交车vectorBus
  public ConcretePassenger() {
    observerList =  new ArrayList();
    vectorBus = new Vector();
  }
  public void attach(BusConductor busConductor) {
      observerList.add(busConductor);   //将公交车售票员增加到观察者列表
  }
 
  public void showPassengerInfo() {
      for(int i = 0; i < observerList.size(); i++) {
          ((BusConductor)observerList.get(i)).getCurrentPassenger(this);  //使公交车售票员获得当前乘客情况
      }
  }
  public void setCurrentPassenger(String act, String str) {
      if(act.equals("up")) {  //乘客上车
          vectorBus.add(str);  //将该乘客增加到公交车vectorBus中
      } else if(act.equals("down")) {  //乘客下车
          vectorBus.remove(str);  //将该乘客从公交车vectorBus中删除
      }
  }
  public Vector getCurrentPassenger() {  //获得当前乘客情况
      return vectorBus;
  }
 
}


5、编写测试类:
public class Test  {
  public static void main(String[] args) {
    Passenger passenger = new ConcretePassenger();
    ConcreteBusConductor busConductor = new ConcreteBusConductor(passenger);
    passenger.attach(busConductor);  //将公交车车售票员和乘客联系起来
 
    //公交车售票员观察到的情况
    System.out.println("公交车售票员观察到的情况:");
    passenger.setCurrentPassenger("up", "乘客张三");  //上来乘客张三
    passenger.setCurrentPassenger("up", "乘客李四");  //上来乘客李四   
    busConductor.observeResult();
 
    //公交车售票员观察到的情况
    System.out.println("公交车售票员观察到的情况:");
    busConductor.findPassengerChange("down", "乘客李四"); //下去乘客李四
    busConductor.findPassengerChange("up", "乘客王五");   //上来乘客王五
    busConductor.observeResult();
  }
}

5、说明:

A:定义:反映对象间的的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

B:在本例中,公交车售票员是观察者,当乘客情况发生变化时,公交车售票员能及时获得这个信息。

C:Observer用于需要及时展现信息变化的系统、比如可以用于股票、税务上等。

来源: http://garyfeng.blogchina.com/index.html


 严禁发表涉及封建迷信、国家政治等敏感问题的内容
 ■ 对本文的评价(带 * 为必填内容,400字以内)    严禁发表涉及封建迷信、国家政治等敏感问题的内容。

* 您的姓名 
您的电子邮件 
您的个人主页 

*
您的评价 

     

 ■ 以往的评价







以上文章版权由原作者所有。未经同意,不得将其任何一部分复制、转载、发布等未授权操作。


Java学习室 — 陈伟波个人主页
E-mail: zz3zcwb@sina.com
COPY RIGHT 2005