设计模式之Observer——公交篇(原创)

类别:Java 点击:0 评论:0 推荐:

设计模式之Observer——公交篇

 

 

说到公交车,我想大家都不陌生吧,坐过公交车的朋友可能都知道,一般公交车上都有售票员(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://com.8s8s.com/it/it14440.htm