設計模式之Observer——公交篇

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

說到公交車,我想大家都不陌生吧,坐過公交車的朋友可能都知道,一般公交車上都有售票員(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:在本例中,公交車售票員是觀察者,當乘客情況發生變化時,公交車售票員能及時獲得這個信息

CObserver用於需要及時展現信息變化的系統、比如可以用於股票、稅務上等。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章