交通灯管理系统
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。
-
信号灯忽略黄灯,只考虑红灯和绿灯。
-
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
-
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
-
每辆车通过路口时间为 1 秒(提示:可通过线程 Sleep 的方式模拟)。
-
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
-
不要求实现 GUI ,只考虑系统逻辑实现,可通过 Log 方式展现程序运行结果。
系统分析
一、系统实现的模拟图,
二、根据系统的要求来提取对象
1、Rode 路
2、Lamp灯
3、Vechicle 车辆
4、LampController 控制灯的切换
三、各对象间的联系
Lamp (灯):设计灯的状态只有两种,即绿为可以行走,灯有一个记录这个灯对面的灯(跟这个灯切换同步,变亮时把自己对应的灯也变亮),下一灯(用来进行灯的切换,这个灯红时,同时把下一个灯变绿)的属性。红为停。灯有操作自己变红变绿的方法,还有返回灯现在状态的方法。
Rode(路):系统中总共应该只有12条路线,所以只能有12个实例Rode对象,在这个系统中只是模拟车辆的路过,所以可以不用设置车辆对象。Rode对象可以随机添加车辆,表示这条路线上来的车辆。并且每隔一秒钟来检查该路线上的灯是否为绿灯。如果是,则把第一辆车放行。
LampController (灯的控制系统):定时来进行灯的切换控制
四、系统的代码实现
package cn.iosoftstone.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;
/**
* 交通灯管理系统中的路对象,在这个对象中,有增加车辆和移除车辆的方法,有路的名字
* @author
*/
public class Rode {
private String name;
private List<String> vehicles=new ArrayList<String>();//每条路上车辆的集合
public Rode(String name)
{
this.name=name;
//使用线程来模拟这条路线上随机增加车辆
ExecutorService executorService=Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
@Override
public void run() {
int i=1;
while(true)
{
try {
Thread.sleep(new Random().nextInt(10)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vehicles.add(Rode.this.name+"的第"+i+"车辆");
i++;
}
}
});
//每隔一秒钟进行检查这条路线上的灯是否为绿灯 ,如是则每次减一辆车
ScheduledExecutorService checkLamp=Executors.newScheduledThreadPool(1);
checkLamp.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
boolean islighted=Lamp.valueOf(Rode.this.name).islighted();//判断这条路上的灯是否为绿灯
if(islighted&&vehicles.size()>0)
{
System.out.println(vehicles.remove(0)+"is travling");
}
}
},
1,
1,
TimeUnit.SECONDS );
}
}
package cn.iosoftstone.interview.traffic;
/**
* 定义交通灯类,因一共为12个类对象,所以在这个系统中以枚举的方式来定义比较合适
* @author
*
*/
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 String next;//表示下一个灯
private String opposite;//表示对面的灯
private boolean lighted;//灯的状态
private Lamp(String opposite,String next,boolean lighted)
{
this.next=next;
this.opposite=opposite;
this.lighted=lighted;
}
//提供一个使自己变红并把下一个灯变绿的方法,表示灯的切换
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;
}
//提供一个变自己变亮,同时也把对面的灯也变亮的方法
public void light(){
this.lighted = true;
if(opposite!= null){
Lamp.valueOf(opposite).light();
}
}
public boolean islighted()
{
return this.lighted;
}
}
package cn.iosoftstone.interview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 进行灯的切换的控制系统
* @author
*
*/
public class LampController {
private Lamp currentlamp=Lamp.S2N;//先给一个灯让它为绿灯
public LampController()
{
this.currentlamp.light();//将这个灯设为绿灯
//定义一个线程来进行灯的切换
ScheduledExecutorService cutLamp=Executors.newScheduledThreadPool(1);
cutLamp.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
currentlamp=currentlamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
package cn.iosoftstone.interview.traffic; /** * 交通系统的总控制器 * @author * */ public class TrafficManager { public static void main(String[] args) { //用来存放每条路线的名称 String [] allRode={"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"}; for (int i = 0; i < allRode.length; i++) { new Rode(allRode[i]);//产生12条路线 } //启动交通灯的控制器 new LampController(); } }