黑马程序员------交通灯管理系统

------- android培训java培训、期待与您交流!----------

交通灯管理系统


模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

1、异步随机生成按照各个路线行驶的车辆。
例如:
     由南向而来去往北向的车辆 ---- 直行车辆
     由西向而来去往南向的车辆 ---- 右转车辆
     由东向而来去往南向的车辆 ---- 左转车辆
     。。。

2、信号灯忽略黄灯,只考虑红灯和绿灯。

3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

5、每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

基本情况分析变成了对象的分析:
石头磨成石刀,石刀可以砍树,砍成木材,木材可以做成椅子


|--StoneKnife =StoneKifeFactory.createKnife(Stone)
|--Stone
|--StoneKnife
|--Material =StoneKnife.cut(Tree);
|--Tree
|--Chair =ChairFactory.makeChair(Material);
|--Material
|--chair

分析结果如下:
|--Road
*每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
*每条路线上随机增加新的车辆,增加到一个集合中保存。
*每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
如果是直接分12条路线反而增加了麻烦:
深度分析Road.每条路线都有与其相对应的路线做相同的工作。直接进行右转操作的假设为直接通行。
假设路上在不确定时间会来一辆车。需要启动一个线程,用来增加车辆。
for(inti=0;i<1000;i++){
try {
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedExceptione) {
e.printStackTrace();
}
vechcies.add(Road.this.name+"_"+i);
}
根据情况来定,每隔一定时间检查一次该路上的灯是否为绿灯,如果为绿,车辆通行。(间隔为1秒)
方法一 直接使用定时器
newTimer().scheduleAtFixedRate(new TimerTask() {
public void run(){
boolean lighted =Lamp.valueOf(Road.this.name).islighted(); //Enum的方法valueOf方法返回Enum对象
if(lighted){
System.out.println(vechcies.remove(0)+" istravering!");
}
}
},
1, 
1);
方法二 使用线程池
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
public void run(){
boolean lighted =Lamp.valueOf(Road.this.name).islighted();
if(lighted){
System.out.println(vechcies.remove(0)+" istravering!");
}
}
}, 
1, 
1, 
TimeUnit.SECONDS);
}
}

|——Lamp分析
初步分析:有十二条路线也就有十二个Lamp。
1、 枚举
"S2W","S2N","W2N","W2E",
"N2E","N2S","E2S","E2W",
"E2W","E2N","N2W","W2S"
2、当做属性(略)
深度分析:每个Lamp都有一个状态(绿或者是红)
十二个灯,有四对是想对应的。(比如当S2W是绿灯,那么N2E也是绿灯)
S2W------>N2E
S2N------>N2S
W2N------>E2S
W2E------>E2W
有四个灯是常绿的(s实际是没有灯的)
E2W、E2N、N2W、W2S
既然有四对是对应的,那么直考虑四个灯就可以了。
状态判断:
private booleanlighted;
public booleanislighted(){
return lighted;
}
//亮绿灯
public voidlight(){
this.lighted =true;
if(oppsite!=null){
Lamp.valueOf(oppsite).light();
}
}
//亮红灯
public LampblackOut(){
this.lighted =false;
if(oppsite!=null){
Lamp.valueOf(oppsite).blackOut();
}
Lamp nextLamp =null;
if(next!=null){
nextLamp =Lamp.valueOf(next);
System.out.println("绿灯从" +this.name() + "-------->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
现在灯有了,就应该有控制灯的一个机制。
|——LampControlor

先设置一条路线的灯是绿色的,每隔一段时间改变一次
同样有两种方法。下面介绍线程池的方法:
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
public void run(){
currentLamp =currentLamp.blackOut();
}
}
10,
10,
TimeUnit.SECONDS);
到这里基本上就已经完成了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值