交通灯管理系统学习的阶段。
首先,我们必须牢记的是:先了解对象,再考虑怎么实现,对象中哪个向外提供方法(提供数据)。首先,我们考虑一个十字路口的场面,我们首先映入脑海的是:各种红绿灯,各种车辆。引入面向对象的思路,我们还需要一个红绿灯管理系统,路线,
再考虑考虑日常生活的常识:
-应考虑左转车辆控制信号等,右转车辆不受信号灯控制(这是我们道路管理办法规定的,右转的车辆有一条引导车道的)。这样
1.根据需求分析分为12条路线,由于线路是相对性,只要考虑从南到北,从南向西拐弯的,从东到西,从东向南拐弯这四个方向,所以只考虑这四条路线。
2.分析类
路有东南西北等各个方向,路上面有许多车,路有车辆驶出减少的方法,路有车辆驶入增加的方法。
灯:因为有十二条路线,所以有十二盏灯。有四对灯为重要路线灯,适合用枚举。
汽车:汽车没有具体方法,适合用字符串表示。
灯控制系统:控制各个方向红绿灯之间的调度。
模拟路这个类,车辆的增加和减少:
1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车集合。
2.在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车
3.在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车
辆集合和将集合中的第一辆车移除掉
package comos.com.interview.traffic; importjava.util.ArrayList;import java.util.List;import java.util.Random;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;publicclass Road {private List<String> vechicles = newArrayList<String>();private String name = null;public Road(String name){ this.name = name; ExecutorService pool =Executors.newSingleThrea1,
描述交通灯,每一条线路对应一个交通灯,即系统一共应该有12个灯,老师用了一个类枚举很好的很简单地解决了这个问题,每个元素都是一个对象,这样很方便的解决了问题。
package comos.com.interview.traffic;publicenum 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);//类枚举,每个元素都是一个类
交通灯控制系统,交通灯控制系统,我们只需先statt一个灯变红或者变绿,然后,再间隔一段时间(大概10秒根据实际情况),再把灯变状态就可以了
package comos.com.interview.traffic;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concurrent.TimeUnit;public class LampController {private LampcontrolLamp;public LampController() { controlLamp = Lamp.S2N; //首先假设某一条线路灯的状态
以上是这个系统,3个关键类的实现过程,由于能力有限,我自己也没能力能完整写出整个系统的代码,都是在老师的代码上看懂了,之后,添加上自己的注释。
增加
xecutorService 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 !");
}
}
}
},
TimeUnit.SECONDS);
红绿灯的变化情况
灯变绿时,它对应方向的灯也要变绿
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);
System.out.println("绿灯从" + name() + "-------->切换为" +next);
nextLamp.light();
}
return nextLamp;
}
灯的控制器
每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println("来啊");
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
产生12条路和和整个交通系统
public class MainClass {
/**
*@param args
*/
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]);
}
newLampController();
}
}