設計模式之State——交通篇(原創)

設計模式之State——交通篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

“小朋友過馬路,左右看,紅燈停,綠燈行,阿姨誇我是乖寶寶。”,我給女兒念着兒歌,突然女兒問我,什麼是紅綠燈啊?爲了給她說清楚,我特意帶她看我們家附近的交通燈(NearMyFamilyTrafficLight)的運行。我們都知道,交通燈有三種狀態:紅燈(RedLight)、黃燈(YellowLight)和綠燈(GreenLight)。交通燈狀態的改變是由控制中心(ControlCenter)來控制的。

 

下面讓我們來看看這個過程是如何實現的。

1、  在這裏,先定義交通燈(TrafficLight)接口類:

public interface TrafficLight {

  public void showRedLight();  //顯示紅燈

  public void showGreenLight();//顯示綠燈

  public void showYellowLight(); //顯示黃燈

}

2、我們家附近的交通燈(NearMyFamilyTrafficLight)是對交通燈(TrafficLight)接口的具體實現:

public class NearMyFamilyTrafficLight implements TrafficLight{

  public void showRedLight(){

    System.out.println("紅燈亮了,不能通過!");

  }

  public void showGreenLight(){

    System.out.println("綠燈亮了,可以通過!");

  }

  public void showYellowLight(){

    System.out.println("黃燈亮了!");

  }

}

3、定義控制中心(ControlCenter)類:

public class ControlCenter {

  private NearMyFamilyTrafficLight trafficLight; //我們家附近的交通燈

  public void changeState(NearMyFamilyTrafficLight trafficLight) {

      this.trafficLight = trafficLight;

  }

  public void showRedLight() { //顯示紅燈

      trafficLight.showRedLight();

  }

  public void showGreenLight() { //顯示綠燈

      trafficLight.showGreenLight();

  }

  public void showYellowLight() { //顯示黃燈

      trafficLight.showYellowLight();

  }

}

4、我們家附近的交通燈(NearMyFamilyTrafficLight)實際上有紅、黃、綠三盞燈組成:

A:紅燈(RedLight)類:

public class RedLight extends NearMyFamilyTrafficLight{

  public static boolean  existRedLight = false;

  public static RedLight getRedLight() {  //獲得紅燈

      if(existRedLight==false) {

          existRedLight = true;

          return new RedLight();

      }

      return null;

  }

}

B:綠燈(GreenLight)類:

public class GreenLight extends NearMyFamilyTrafficLight{

  public static boolean  existGreenLight = false;

  public static GreenLight getGreenLight() { //獲得綠燈

      if(existGreenLight==false) {

          existGreenLight = true;

          return new GreenLight();

      }

      return null;

  }

}

C:黃燈(YellowLight)類:

public class YellowLight extends NearMyFamilyTrafficLight{

  public static boolean  existYellowLight = false;

  public static YellowLight getYellowLight() { //獲得黃燈

      if(existYellowLight==false) {

          existYellowLight = true;

          return new YellowLight();

      }

      return null;

  }

}

5、編寫測試類:

public class Test {

  public static void  main(String args[]){

    ControlCenter controlCenter = new ControlCenter();   //控制中心

    NearMyFamilyTrafficLight redLight = RedLight.getRedLight();  //紅燈
          NearMyFamilyTrafficLight greenLight = GreenLight.getGreenLight(); //綠燈
          NearMyFamilyTrafficLight yellowLight = YellowLight.getYellowLight(); //黃燈

    controlCenter.changeState(redLight); //改變成紅燈狀態

    controlCenter.showRedLight();  //顯示紅燈

    controlCenter.changeState(yellowLight); //改變成黃燈狀態

    controlCenter.showYellowLight();  //顯示黃燈

    controlCenter.changeState(greenLight);  //改變成綠燈狀態

    controlCenter.showGreenLight(); //顯示綠燈

  }

}

6、說明:

AState的定義: 不同的狀態,不同的行爲;或者說,每個狀態有着相應的行爲。

B我們可以看到,燈狀態的改變是有控制中心來控制,通過顯示不同的燈,實現了交通的正常運轉。

C:因此當有狀態切換這種事情要處理時,我們就可以用State這種模式了。

 

 

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