------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
交通灯管理系统的学习与分析
针对这个题目,最重要的是对题目进行分析,首先,我们应该从我们最熟悉的路口进行入手,并画一张示意图进行描述,示意图如下:
由上图可知,在一个十字路口,一共有12条线路可以同行。
同时,为了方便起见,做出以下设定:
1. 忽略黄灯(黄灯只是在绿灯变红灯的时候加入几秒钟,去除不影响该系统的整体实现效果)。
2. 因为车辆始终可以向右转弯,所以右转路线的交通灯始终为绿灯,这样统一划定,便于编程实现。
该系统所设定的对象:红绿灯、红绿灯控制器、汽车、路。
对车辆进行分析
汽车通过路口的条件:1.绿灯亮。2.前面没有车。
对路进行分析
路中存有车辆的集合,同时也应有增加和删除车辆的方法。
面向程序设计的重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。
因为有12种路线,所以应有12个实例对象,此处使用枚举,更加方便。
对灯进行分析
除去向右转弯的4个灯共有8个灯,在这8个灯中,相对的灯点亮情况相同,即灯又是成对出现,所以只需要分析4组就可以了。此处分析S2N,S2W,E2W,E2S四个方向上的灯。
灯必须保存3个信息:1.绿灯是否点亮。2. 相对灯的信息。3. 下一个灯的信息。
加入是右转方向的灯,则不需要这3个信息。
编码阶段
对 “路”的定义
判断灯的点亮情况,并且获取车辆和释放车辆。package com.itheima.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.newSingleThreadScheduledExecutor();
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);
}
}
对“灯”的定义
使用枚举列出12条道路上灯的点亮情况,并设置方法,当一个方向上绿灯点亮,则对应的一侧绿灯也会点亮。当一个方向绿灯熄灭,则对应的一侧的绿灯也熄灭,同时控制下一组绿灯点亮。
package com.itheima.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 Lamp(){
}
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个方向上能看到汽车穿过!");
}
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;
}
}
对控制器的定义
对路灯进行定时点亮和熄灭。
package com.itheima.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(){
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
主函数:
package com.itheima.traffic;
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]);
}
new LampController();
}
}