黑马程序员-->7K面试题-->交通灯管理系统

来源:互联网 发布:剪辑音乐软件手机软件 编辑:程序博客网 时间:2024/05/16 14:46

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

 

一、交通灯管理系统项目需求:

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

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

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

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

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

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

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

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

 

二、项目分析

1、对十字路口进行图解分析:


 

 

 

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

2、面向对象的分析与设计:
(1)我们初步设想一下有哪些对象:红绿灯,红绿灯的控制系统,汽车,路线。
   汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?
该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,
只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。
  注意:面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。

(2)对路线对象的分析:
每条路线上都会出现多辆车,车对象就相当于是路的数据存在,路线上要随机增加新的车,且要在灯绿期间还要每秒钟减少一辆车,
路就需要有增删的方法。
 a、设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
 b、每条路线上随机增加新的车辆,增加到一个集合中保存。
 c、每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
 
(3)对红绿灯和红绿灯控制系统两个对象的分析:
每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
  a、设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,
并且能返回自己的亮黑状态。
  b、总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,
故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
  c、除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,
对这4个灯依次轮流变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,
在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随着下一个灯的变亮,
Lamp类中还用一个变量来记住自己的下一个灯。
  d、无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,
永远都只有代表12个方向的灯的实例对象。
  e、设计一个LampController类,它定时让当前的绿灯变红。

 

三、代码实现

1、Road类的编写
对公路对象的描述:公路对象内需要有一个装载汽车的集合,并且一初始化就需要定义一个线程对汽车以随机的时间频率进行添加的动作。
和一个固定时间频率的线程对汽车进行去除的动作。添加动作不受红绿灯限制,去除动作需要受红绿灯限制。
代码如下:

 

2、Lamp类的编写
对灯的描述:一共有十二个红绿灯,灯一共分为三类灯,基准灯、对应灯、常绿灯。
对灯的操作:主要是针对基准灯,对应灯同步基准灯的变化即可,常绿灯初始化后,无需再操作。基准灯有亮绿灯和亮红灯的功能,
亮绿灯时,对应灯也需要跟着亮绿灯;亮红灯时,对应灯也需要跟着亮红灯,并且点亮自己的下个基准灯,并返回下个基准灯对象。
代码如下:

 

3、LampController类的编写
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
红绿灯控制器(系统):在LampController构造方法中一初始化,就需要设定第一个为绿的灯。
将当前灯变绿后启动一个定时器,每隔10秒将当前灯变红,对当前灯操作同时点亮下个灯(变绿),
并返回下个灯,因此下个灯就成了正在被操作的灯,依次循环。
代码如下:

 

4、MainClass类的编写
用for循环创建出代表12条路线的对象。
创建红绿灯控制系统对象,启动系统。
代码如下:

 

 

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

0 0
原创粉丝点击