交通灯管理系统
首先要做需求分析,然后設計這個項目的結構和功能。具體來說,就是這個項目應該包含哪幾個類,這些類與類之間的聯系,以及這些類中分別需要實現的方法。要弄明白這些不是一件容易的事,坦白說,我自己想一天也未必能想明白。呵呵,這就是能力啊。張老師把這些都分析的非常清楚:
1.總共有12條路線,為了統一編程模型,可以假設每條路線都有一個紅綠燈對其進行控制,右轉彎的4條路線的控制燈可以假設稱為常綠狀態,另外,其他的8條線路是兩兩成對的,可以歸為4組,所以,程序只需考慮1S2N?2S2W?3E2W?4E2S?這4條路線的控制燈的切換順序,這4條路線相反方向的路線的控制燈跟隨這4條路線切換,不必額外考慮。
?
2.為了使思路更加清晰,開始只考慮從南面開來的車輛:
1)右轉(S2E)的信號燈永遠是綠燈;
2)同方向等待車輛應先放行直行車輛(S2N)而后放行左轉車輛(S2W)。
?
3.面向對象的分析與設計:
1)初步設想一下有哪些對象:紅綠燈,紅綠燈的控制系統,汽車,路線。
2)汽車看到自己所在路線對應的燈綠了就穿過路口嗎?不是,還需要看前面是否有車,看前面是否有車,該問哪個對象呢?該問路,路中存儲著車輛的集合,顯然路上就應該有增加車輛和減少車輛的方法了。(面向對象設計把握一個重要的經驗:誰擁有數據,誰就對外提供操作這些數據的方法。)再看題目,我們這里并不要體現車輛移動的過程,只是捕捉出車輛穿過路口的過程,也就是捕捉路上減少一輛車的過程,所以,這個車并不需要單獨設計成為一個對象,用一個字符串表示就可以了。在1中初步設想的對象就減少了一個。這個項目只需要3個對象即可。
3)在這個十字路口,有且僅有12盞紅綠燈,因此紅綠燈可以用枚舉來實現。其中右轉的四盞燈常綠,剩下的八盞燈可以分為4組。因此只需要考慮4盞燈的紅綠變化。
?
4.跟隨老師一起編寫代碼:
1)Road類:
public class Road {private List<String> vehicles = new ArrayList<String>(); //用這個List來裝載這條路上的車private String name = null; //這條路線的名字。同時也是它所對應的燈的名字。public Road(String name) //構造方法,每創建一條路時都必須為它命名{this.name = name;//啟動一個線程,不停地向這條路上增加車輛。額,這種啟動線程的方法以前沒用過,多多學習下。ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable(){@Overridepublic void run(){for (int i = 0; i < 1000; i++){try{Thread.sleep((new Random().nextInt(10)+1) * 1000);} catch (InterruptedException e){e.printStackTrace();} // vehicles.add(name + "_" + i);這樣寫編譯會報錯,因為這里訪問的是這個構造方法里的局部變量。在匿名內部類里訪問局部變量,這個局部變量必須用final修飾符修飾。所以這里有兩種改法:1.加final修飾符,2.在這里訪問外部類的成員變量。vehicles.add(Road.this.name + "_" + i); //訪問外部類的成員變量。}}});//啟動一個定時器。這種方法我以前也沒用過。額,這種方法的確比TimeTask什么的好用多了。ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate( //這個方法需要四個參數new Runnable() //參數1:任務。如果是綠燈,并且路上有車,就移走一輛車{@Overridepublic void run(){if (vehicles.size()>0){boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); // if (true == lighted) 這行代碼的不妥之處在于畫蛇添足if (lighted){System.out.println(vehicles.remove(0) + "is traversing ! ");}}}}, 1, //參數2:多少時間后開始執行任務1, //參數3:每隔多少時間執行一次任務TimeUnit.SECONDS //參數4:前面這兩個時間的單位);} }2.Lamp枚舉
3.紅綠燈的控制系統:LampController類 public class LampController {private Lamp currentLamp;public LampController(){currentLamp = Lamp.S2N; //最開始設定S2N這個燈是綠的currentLamp.light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() //每隔10s將當前燈變暗,同時將currentLamp變為下一盞燈。{@Overridepublic void run(){System.out.println("燈控定時器");currentLamp = currentLamp.blackOut();}},2,2,TimeUnit.SECONDS);}}
4.項目的主類:MainClass public class MainClass {public static void main(String[] args){//new出12條路線,再加一個燈控制器,就可以模擬一個十字路口了。String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for (int i = 0; i < directions.length; i++){new Road(directions[i]);}new LampController(); //紅綠燈控制器} }
看完第一遍視屏,感覺就像看天書一樣,云里霧里的,沒明白啥意思,看第二遍的時候,就有感覺了,但是還有一些不明白的地方,再看一遍的時候,就明白了
總結
- 上一篇: 彩信编辑器之预览功能
- 下一篇: opengl模板缓冲区