交通燈管理系統


在 面向對象程序設計中,誰擁有數據誰就對外提供操作這些數據的方法。經典例子:人在黑板上畫圓(對象有人,黑板,圓,圓有數據半徑,面積,周長,所以應該是 圓提供這些方法),售票員通過小票清點貨款和商品(對象有售票員,小票,售票員通過調用小票的gettotalmoney()方法得到貨款等)。

兩塊石頭磨成石刀,石頭刀砍樹,砍成木材,木材做成椅子。

石頭磨成刀,如果它自身提供這個功能的話,那就最後沒了,顯然不會,所以這裏有一個磨刀工廠,原料是石頭,產品是石頭刀

stoneKnife knifeFactory(Stonge s).

石頭刀有砍樹方法,原料是樹,產品是木材 wood cut(Tree t)

椅子加工廠,原料是wood,產品是chair 。  Chair chairMaker(Wood w).

在 交通燈管理系統中,有對象車,路,燈,還有燈控制系統,用字符串表示車,放在ArrayList中,封裝在Road類中,Road類有當綠燈時把車放行的 方法,還有隨機的增加車輛的方法。所有的燈共12只都封裝在Lamp類中,Lamp類提供的方法有:變綠,變紅。燈的控制系統封裝在類 lampControl中,提供的方法是當前燈綠,過一定時間後下一個燈綠,同時當前燈和對面的燈都變紅。

下面是代碼:
Lamp 類

package com.isoftstone.interview.traffic;


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(){   //將燈變亮的方法封裝在類Lamp中
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面總共應該有6個方向能看到汽車穿過!");

}


public Lamp blackOut(){                //將燈變黑的方法封裝在類Lamp中

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;
}
}

LampController類:

package com.isoftstone.interview.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(){
System.out.println("來啊");
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}

Road類:

//Road類中封裝了路上車的增加和減少。
package com.isoftstone.interview.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
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> 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;i<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 !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);

}
}


Main類!

package com.isoftstone.interview.traffic;

public class MainClass {


public static void main(String[] args) {


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();
}

}

小結:我認識到做項目前應該先把思路理清,然後纔是具體代碼的實現。另外,通過今天的學習我對面向對象程序設計認識更進了一步,但自己思考問題解決問題能力和代碼實現能力還很欠缺,路漫漫啊,繼續努力吧,加油!


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