黑马程序员—— 交通灯管理系统
需求分析
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。
信号灯忽略黄灯,只考虑红灯和绿灯 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
1 Road类 2 import java.util.ArrayList; 3 import java.util.List; 4 import java.util.Random; 5 import java.util.concurrent.ExecutorService; 6 import java.util.concurrent.Executors; 7 import java.util.concurrent.ScheduledExecutorService; 8 import java.util.concurrent.TimeUnit; 9 ** 10 * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。 11 * 每条路线上随机增加新的车辆,增加到一个集合中保存。 12 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。 13 * @author 14 * 15 */ 16 public class Road { 17 private List<String> vechicles = new ArrayList<String>(); 18 private String name =null; 19 public Road(String name){ 20 this.name = name; 21 //模拟车辆不断随机上路的过程 22 ExecutorService pool = Executors.newSingleThreadExecutor(); 23 pool.execute(new Runnable(){ 24 public void run(){ 25 for(int i=1;i<1000;i++){ 26 try { 27 Thread.sleep((new Random().nextInt(10) + 1) * 1000); 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } 31 vechicles.add(Road.this.name + "_" + i); 32 } 33 } 34 }); 35 //每隔一秒检查对应的灯是否为绿,是则放行一辆车 36 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); 37 timer.scheduleAtFixedRate( 38 new Runnable(){ 39 public void run(){ 40 if(vechicles.size()>0){ 41 boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); 42 if(lighted){ 43 System.out.println(vechicles.remove(0) + " is traversing !"); 44 } 45 } 46 } 47 }, 48 1, 49 1, 50 TimeUnit.SECONDS); 51 } 52 }
1 MainClass类 2 public class MainClass { 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 /*产生12个方向的路线*/ 8 String [] directions = new String[]{ 9 "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S" 10 }; 11 for(int i=0;i<directions.length;i++){ 12 new Road(directions[i]); 13 } 14 /*产生整个交通灯系统*/ 15 new LampController(); 16 } 17 }
谁拥有数据,谁就对外提供操作这些数据的方法。
首先,分析这个交通灯系统,先按事件发展的时间顺序纵向分析过程,交通灯是怎么变化的,变化后路上的车行驶方向怎么变化的。在这个过程中,要去除重复性问题的考虑,简化问题,比如,主要就只需要考虑四个方向的灯亮灭问题,另外也只需要考虑两个方向的车辆通断变化问题。
其次,横向分析所要建立的各个模块如何实现,分别需要实现什么功能,先是设计了灯的类,先存储了各个灯的变化情况及其取值范围,这个过程分析的越仔细越准确,就越有利于我们选择出最合适的设计程序的方法,再者又设计了反映道路通断的Road类,并在这个类中依据灯变化情况提供操作车辆的方法。
最后是提供灯控制的类。