設計模式之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、說明:
A:State的定義: 不同的狀態,不同的行爲;或者說,每個狀態有着相應的行爲。
B:我們可以看到,燈狀態的改變是有控制中心來控制,通過顯示不同的燈,實現了交通的正常運轉。
C:因此當有狀態切換這種事情要處理時,我們就可以用State這種模式了。