-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
现实生活中,交通灯在公路上随处可见,尤其是在十字路口,更需要交通灯来管理巨大的车流。这道题目就是设计一个交通灯。
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
Ø异步随机生成按照各个路线行驶的车辆。例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆---- 右转车辆
由东向而来去往南向的车辆---- 左转车辆
。。。
Ø信号灯忽略黄灯,只考虑红灯和绿灯。
Ø应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
Ø具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
Ø每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
Ø随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
一、现实路况分析
首先抛开交通灯,先分析一下十字路口车辆行驶的规律。看下图,
以向南的公路为例,车辆可以向3个方向前进(2意为to):S2W,S2N,S2E。每个方向的公路都有3个前进方向,总共有12条方向。但是仔细分析就会发现,S2N和N2S其实是同一车流,只能由北向南开或者只能由南向北都是不可能的。所以,严格意义上,总共是4种车流:
1.S2N、N2S
2.E2W、W2E
3.S2W、N2E
4.W2N、E2S
二、需求分析
下图是一个真实的十字路口的交通灯,也是目前最常用的形式。有3个灯组成,每个灯都可以独立现实红、黄、绿,并指示相应的方向:左转、右转、直行。
按照需求分析如下:
1. 按照需要,只有红灯和绿灯,不考虑黄灯。也可以理解为亮(绿灯)与不亮(红灯)。
2. 由于提示不用考虑右转,所以应该假设右转灯始终为绿色(亮灯)。
3. 现实生活中,某个方向上,例如南北,总是先直行然后左转,左转完毕后东西方向上的直行和左转。如此循环执行。
4. 通过左转灯和直行灯的不同组合开控制车流,每辆车只要看自己面前的灯即可,不用考虑其他方向的灯。不考虑汽车想要行驶的方向,汽车受灯控制:红灯停绿灯行。
5. 每辆车通过的时间为1秒,也就是说,绿灯如果亮5秒,会有5辆车通过。
三、面向对象分析和设计
可能出现的对象有:交通灯、交通灯控制器、汽车和路。
汽车看到灯变绿后,不能马上前进,还要确定前面没有汽车才能前进,也就是只有第一辆车才能前进。如何确定前面是否有车?应该询问路,路上储存车的集合,也有增加和减少汽车的方法。本题关注的不是车辆移动过程,而是车辆通过路口的过程,所以车辆不需要单独设计成对象,只要将其用字符串表示,即“1号车通过”、“2号车通过”。这里的路,也可以理解为车流。
这也是面向对象编程的经验:谁拥有数据,谁就要对外提供操作数据的方法。例如,人在黑 板上画圆,画圆的动作是由黑板做出的,人只是在调用方法。
综合上面的分析,只需要3个类:交通灯(Lamp类)、控制系统(LampController类)和路(Road类)。
Road类的设计:
每条路线内都有一个集合,元素为车辆。
绿灯时,每秒减少一辆车;红灯时,随机增加车辆。
因为有12条路线,需要有12个Road对象。
每条路线每秒都要检查对应的灯是否为绿(亮),是的话即移除集合中的第一辆车,表示汽车通过路口。
Lamp类的设计:
每个灯在一段时间内只有一个状态:绿或红,每个灯都有变绿或 者变红的方法,并且可以返回下一个灯。因为只有2个状态,可以使用布尔值的真假表示:真(绿)、假(红)。
因为有12条线路,所有有12个交通灯。不考虑右转,所以4个右转灯始终是绿灯,车辆可以随时右转。
除了右转,还有8个方向,考虑对面而行可以合为一个方向,实际只有4个方向的车流。实际编程时,每个方向的车流只需要使用一个灯表示即可(主灯),所以只需要4个灯来控制车流。这4个灯会依次变绿。每个灯变绿时,对面方向的灯(辅灯)也会变绿,变绿后汽车通过路口;主灯变红后,也会使得辅灯变红。主灯和辅灯由开发者根据个人喜好确定,主灯可以控制辅灯,辅灯不能控制主灯。
每个灯变红后,会将下一个灯变绿、辅灯变动,这就需要2个成员变量:辅灯和下一个灯;还需要记住自己的状态,是否为绿,所以共有3个成员变量。
LampController类的设计:
需要一个监视器,随时监视本灯的状态,时间一到就将当前的灯变红,并监视下一个灯,循环执行。
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
详情请查看:http://edu.csdn.net/heima