交通燈管理學習心得
在國際化的大都市中,時時刻刻都出現着這種情況:在某一個十字路口的某個時段,有時聚集着成百上千輛車,在那裏有條不紊的行駛着。
那麼是什麼東西保證了它們的安全的行駛呢?我想大家都想說是:交通燈吧。那麼又是什麼讓交通燈那樣有序的交替的變換來保證車輛的安全
行駛呢?那麼就是它背後的交通燈管理系統這個強大的項目吧。
學習完Java加強後,我進入了交通燈管理系統的學習。這是我第一次做這種小項目。在做的過程中有很多地方給我留下了深刻的印象,
下面我就來簡單的說說我的學習心得了。
1.關於項目模型的建立(畫圖)
首先,對於交通燈管理這個項目,它取決於現實的生活中的模型。要求我們將現實生活中的東西運用代碼的方式在電腦上進行模擬。對
於它我們並不陌生。但是在我們進行程序設計之前必須要將它的運行的方式給搞明白了。比如,一個十字路口有多少個燈?又分爲幾種顏色?
那些燈又是怎麼交替的進行的?還有就是哪些燈應該是長綠的?每個燈的交換時間又是多少呢? 等等。。還有很多值得我們去好好的思考,
對於那些複雜的交通線,我們想來想去不如直接畫圖來的更加的簡單明瞭,更加方便我們進行透徹的分析和理解。只要理解了那麼在進行實際
的開發中就不是那麼的難。
2.面向對象的實現(分析)
大家都知道Java的核心思想我想就是面向對象了,對於面向對象它有封裝,繼承和多態這麼三個特徵。在這個項目中我們在進行程序的代碼
編寫之前必須要先明白有哪些個對象,每個對象中又有哪些個屬性和方法。這些都是我們先掌握的。不是有一句話叫“兵馬未動,糧草先行”麼?
我們只有做好充分的準備,那麼在代碼的書寫中才會顯得得心應手。行如流水。下面來看看具體的步驟吧!
一.每條路線上都會出現多輛車,路線上要隨機增加新的車,在燈綠期間還要每秒鐘減少一輛車
1.設計一個Road類來表示路線,每個Road對象代表一條路線,總共12條路線,所以系統中總共要產生12個Road實例對象出來
2.每天路線上隨機增加新的車輛,增加到一個集合中保存。
3.每天路線每隔一秒都會檢查控制本路線的燈是否爲綠,是則將本路線保存車的集合中的第一輛車移除,即表示車穿過了路口。
二.每條路線每隔一秒都會檢查控制本路線的燈是否是綠,一個燈由綠變紅時,應該將下一個方向的燈變綠。
1.設計一個Lamp類來表示一個交通燈,每個交通燈都維護一個狀態:亮(綠)或不亮(紅),每個交通燈要有變亮和變黑的方法,並且能
返回自己的亮黑狀態。
2.總共有12條路線,所以系統中總共要產生12個交通燈。右拐彎的路線本來不受燈的控制,但是爲了讓程序採用統一的處理的方式,故假
設出有四個右拐彎的燈,只是這些燈爲常亮狀態,即永遠不變黑。
3.除了右拐彎方向的其他8條路線的燈,它們是兩兩成對的,可以歸爲4組,所以,在變成處理時,只要從這4組中各取出一個燈,對這4個燈
依次輪詢變亮,與這4個燈方向對應的燈則隨之一同變化,因此Lamp類中要有一個變量來記住自己相反方向的燈,在一個Lamp對象的變亮和
變黑的方法中,將對應方向的燈也變黑和變亮。每個燈變黑時,都伴隨着下一燈的變量,Lamp類中還有一個變量來記住自己的下一個燈。
三.每個燈都是由燈的管理器來管理它是否亮或者不亮的。
所以應該設計一個Lampcontrol類表示一個燈的管理器。
3.代碼的實現
注意:1.在代碼的實現的過程中有一個位置我們應該注意,那就是lamp這個類,我們應該定義爲枚舉類型的,因爲這樣在以後的運用當中就會很方便
2.還有就是線程池的運用也很巧妙。
這是JDK1.5裏面的新特性。
具體的代碼實現我就展示一下吧!
Lamp類的實現
package com.isofe.inview.traffic;
public enum Lamp {
S2N("N2S","S2W",false), S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2E",false),
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
private Lamp(String opposite,String next, boolean lighted){
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
private Lamp(){
}
private boolean lighted ;
private String opposite;
private String next;
public boolean islight(){
return lighted ;
}
public void light(){
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+"lamp is green 下面總共有6個方向的車在通過!");
}
public Lamp blackOut(){
this.lighted = false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp = null;
if(next != null){
nextLamp = Lamp.valueOf(next);
nextLamp.light();
System.out.println("綠燈從"+name()+"切換爲------->"+ next);
}
return nextLamp;
}
}
LampController的實現
package com.isofe.inview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp;
public LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run(){
currentLamp = currentLamp.blackOut();
}
}, 10, 10, TimeUnit.SECONDS);
}
}
Load類的實現
package com.isofe.inview.traffic;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
private List<String> vehicles = new ArrayList<String>();
private String name= null;
public Road(String name){
this.name = name;
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(int i=1; i<1000; i++){
try {
Thread.sleep(new Random().nextInt(10000+1000));
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("汽車加載失敗");
}
vehicles.add(Road.this.name+" "+i);
}
}
});
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vehicles.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).islight();
if(lighted){
System.out.println(vehicles.remove(0)+" is Traversing!!");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
MainClass類的實現
package com.isofe.inview.traffic;
public class Mainclass {
public static void main(String[] args){
String[] dir = new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(int i=0;i<dir.length;i++){
new Road(dir[i]);
}
new LampController();
}
}
總結:1.在這個項目的實現之中,用到的一些JDK1.5的新特性給我們的程序設計帶來了莫大的方便和簡潔。比如枚舉和線程池的運用。
也是我們以前沒有用到的知識。所以對新特性的學習還是很有必要
2.還有一點是讓我出乎意料的。就是車這個事物,我們不用把它設計成一個對象。而是用一個字符串來代替。這裏非常值得我
們去思考。