黑马程序员

导航

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

 

需求分析

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

异步随机生成按照各个路线行驶的车辆。

例如:

由南向而来去往北向的车辆 ---- 直行车辆

由西向而来去往南向的车辆 ---- 右转车辆

由东向而来去往南向的车辆 ---- 左转车辆

。。

信号灯忽略黄灯,只考虑红灯和绿灯 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

每辆车通过路口时间为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类,并在这个类中依据灯变化情况提供操作车辆的方法。

最后是提供灯控制的类。

 

 

 

 

 

 

 

 

posted on 2012-04-15 00:29  黑马—jieqi  阅读(690)  评论(0编辑  收藏  举报