您的位置:首页 > 职场人生

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

2013-05-14 10:52 176 查看
-----------------------android培训java培训、java学习型技术博客、期待与您交流!
----------------------
交通灯管理系统
 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

Ø  
异步随机生成按照各个路线行驶
4000
的车辆。
例如:

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

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

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

      
。。。

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

Ø      每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
Ø     随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。 Ø       不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
根据上面的分析,我们可以画图解析:



(1-1)
由图(1-1)我们可以知道的是:总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。

友情提示:

(1):红绿灯,红绿灯的控制系统,汽车,路线。汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。

(2):面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。

项目中需要注意的问题:

1,我们知道:总共有12条路线,所以,系统中总共要产生12个交通灯。这12个交通灯都是固定不变的,由此,我们想到的是枚举(枚举就是让某个类型的变量的取值只能为若干个固定值中的一个)。

2,  每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿(只需要控制4个灯的方向,其实也就是灯的颜色,因为其他的都是与这4个灯颜色作参照并对应的灯颜色是相同的。还有一种就是右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯。)。

所以我们在设计程序的时候,只需要设计4个灯,这4个灯,我们可以称之为逻辑灯。

灯的设计重要程序:

public void light(){//当灯变亮的时候

        this.lighted = true;

        if(opposite != null){//对应方向的灯,灯的颜色保持一致

               Lamp.valueOf(opposite).light();//对应方向的灯也变亮

        }

        System.out.println(name() + " lampis 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;//返回下一个灯

}

友情提示:某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿。

3, 灯控制器:设置红绿灯的时间,并在规定到的时间进行切换动作。

/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/          

              ScheduledExecutorServicetimer = Executors.newScheduledThreadPool(1); //调用器中只需要一个线程就行了

              timer.scheduleAtFixedRate(//创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期

                            newRunnable(){

                                   public  void run(){

                                          currentLamp= currentLamp.blackOut();//灯的时间一到,就变成红色,并赋值给下一个灯

                            }

                            },

                            10,//隔10s执行Runnable()方法

                            10,//每次隔10s执行Runnable()方法

                            TimeUnit.SECONDS);//设置单位为s

       }

友情提示:ScheduledExecutorService:schedule方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。

4,Road类的编写

分析:(1)每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。

   
(2)每条路线上随机增加新的车辆,增加到一个集合中保存。

   
(3)每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

友情提示:在控制车辆次数的时候,需要两个线程来进行控制(如果是一个线程,你不能

说第一辆车在sleep的时候,第二辆车还没有生产出来,这样不合适。)

总结:(1)按照面向对象的思想,对项目进行分析,需求的对象实例

(2)注意定时器的使用,这个使用比较广泛

(3)灯的颜色使用泛型

(4)以我这个灯为例,跟对应的灯颜色保持一致,与下个灯相反(注意:左右拐弯不受影响)

 

-----------------------android培训java培训、java学习型技术博客、期待与您交流!
----------------------
 

9a8c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: