交通燈管理系統的學習心得

     交通燈管理學習心得
   在國際化的大都市中,時時刻刻都出現着這種情況:在某一個十字路口的某個時段,有時聚集着成百上千輛車,在那裏有條不紊的行駛着。
那麼是什麼東西保證了它們的安全的行駛呢?我想大家都想說是:交通燈吧。那麼又是什麼讓交通燈那樣有序的交替的變換來保證車輛的安全
行駛呢?那麼就是它背後的交通燈管理系統這個強大的項目吧。
   學習完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.還有一點是讓我出乎意料的。就是車這個事物,我們不用把它設計成一個對象。而是用一個字符串來代替。這裏非常值得我
 們去思考。

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