黑馬程式設計師11-7k面試題交通燈
---------------------- android培訓、java培訓、期待與您交流!
----------------------
1,交通燈管理系統的需求是什麼?
非同步隨機產生按照各個路線行駛的車輛
比如:
由南向北行駛的車輛視為直行車輛
由南向西行駛的車輛視為左行車輛
。。。
訊號燈忽略黃燈,只考慮紅燈和綠燈
左轉車輛控制訊號燈,右轉車輛不受訊號燈控制
具體的訊號燈控制邏輯和現實生活中的交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。
每輛車通過路口的時間為1秒。
隨機生成車輛時間間隔和紅綠燈交換時間間隔自定,可以手動設定。
不需要使用GUI,只考慮控制邏輯。
通過畫圖得出來的行駛路線圖
2,交通燈的面向物件分析中有幾個物件?
路 不需要將汽車單獨設計成一個物件,只需要把它設計為一個字串即可
紅綠燈 紅綠燈要變化,需要使用列舉
紅綠燈控制系統
3,如何對交通燈進行面向物件的分析與設計?
每條路上會出現多輛車,路線上要隨即增加車,子啊紅綠燈期間還要每秒減少一輛車。
設計一個Road類來表示路線,每個Road物件代表一條;路線,總共有12條路線,即系統中總共要產生12個Road例項物件。
每條路線上隨即增加新的車輛。
每條路線上隨機增加新的車輛,增加到一個集合中保持。
每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線儲存車的集合中的第一輛車移除,即表示車穿過了路口。
每條路線每隔一秒都會檢查控制本路線的燈是否為綠,一個燈由綠變紅時,應該將下一個方向的燈變綠。
設計一個Lamp類來表示交通燈,每個交通燈都維護一個狀態:亮和不亮,亮表示綠,不亮表示紅。
每個交通燈由自己變亮和變黑的方法,並且能返回自己的亮黑狀態。
4,如何設計Road物件?
/*
需求:設計一個Road類,每條路線上隨機增加新的車輛,增加到一個集合中儲存。
每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線儲存車的集合中的第一輛車移除,即表示車穿過了路口。
思路:1,採用列舉,將十二個方向設計成十二個類的例項物件。
2,設計一個ArrayList集合,用字串代表車。
*/
public class Road
{
private List<String> vechicles=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;1<1000;i++)
{
try
{
Thread.sleep((new Random().nextInt(10)+1)*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
vechicles.add(Road.this.name+"_"+i);
}
}
});
}
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable()
{
public void run()
{
if(vechicles.size()>0)
{
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted)
{
System.out.println(vechicles.remove(0) + " is traversing !");
}
}
}
}
TimeUnit.SECONDS);
}
}
5,如何設計代表燈的Lamp類的程式碼?
由於只有一套控制系統,所以設計成單例設計模式。
每個Lamp元素代表一個方向上的燈,總共有12個方向,所有總共有12個Lamp元素。
public enum Lamp {
/*每個列舉元素各表示一個方向的控制燈*/
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",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 boolean lighted;
/*與當前燈同時為綠的對應方向*/
private String opposite;
/*當前燈變紅時下一個變綠的燈*/
private String next;
public boolean isLighted(){
return lighted;
}
/**
* 某個燈變綠時,它對應方向的燈也要變綠
*/
public void light(){
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面總共應該有6個方向能看到汽車穿過!");
}
/**
* 某個燈變紅時,對應方向的燈也要變紅,並且下一個方向的燈要變綠
* @return 下一個要變綠的燈
*/
public Lamp blackOut(){
this.lighted = false;
if(opposite != null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp= null;
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("綠燈從" + name() + "-------->切換為" + next);
nextLamp.light();
}
return nextLamp;
}
}
---------------------- android培訓、java培訓、期待與您交流!
----------------------