读书人

黑马软件工程师_交通灯管理系统(一)

发布时间: 2012-10-20 14:12:48 作者: rapoo

黑马程序员_交通灯管理系统(一)

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

?

??????? 今天学习了交通灯管理系统这个项目,看了第一边视频感觉没怎么弄明白,说起来有点惭愧,可能是平时不怎么观察交通灯在各个灯之间怎么切换的,然后有看了一边视频,照着张老师那个ppt上的路线图看了许久,终于弄明白是咋回事了。

?????????? 先把这个项目的需求帖一下:

?

?????????????????? 交通灯管理系统

?

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

?

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

?

??????????? 例如:

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

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

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

???????????????? 。。。

?

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

?

?

???????注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行

???????????车辆而后放行左转车辆。

?

?

?

?

?

?????????首先是进行面向对象的分析与设计,其思路就是要先找出系统中存在哪些对

象,最基本、最笨的方法就是先找系统中有哪些名词,然后再根据系统的实际要求

看能否将其设计为一个对象。??

?

???????? 系统中应设计一个Road类表示路线,系统中一共有12条路线,每个Road

类的实例化对象都代表着以条路,即可产生12个Road类的对象分别用来对应这12

条路,随机为每一条路上增加新的车辆,将其添加到一个集合中保存(在这里设计的一条重要原则就是“就是谁拥有数据,谁就对外提供操作这些数据的方法”,

Road类拥有了一个存放车辆的集合,所以就要提供对这些车辆操作的方法,即就

?是向路面上增加车辆和从路面上把车辆移走的方法)

?

???????? 在现实生活中一个十字路口上一共有8个灯(也就是四组:东、西、南、北四个方向各有一组,每一组当中的一个表示车辆直行的灯,另一个表示车辆拐弯的灯),这8个灯分别控制着8条路线上的车辆的行驶,而其他四条路(S2E、E2N、N2W、W2S)是不受信号灯控制的,现在为了统一编程模型,也假设在这死条拐弯的路上也分别有一个灯控制,只不过是将这四个灯设置为常绿?,相当于这四个灯什么都没有做,只为了统一编程模型,即有一个灯的类Lamp。

?

????????为了控制各组灯的来回切换,还要有一个灯的控制器即LampController。

?

????????? ?这样就初步形成了一个系统模型,下面对这个系统的运行流程做一说明 (12条路和8个灯的切换),按如下思路分析:

????????

???????1. 假设现在是南北路线上的灯是绿的,此时可以通行的路线一共有6条:

???????????? S2N(南--->北)、N2S(北--->南)

???????????? S2E(南--->东)、E2N(东--->北)、N2W(北--->西)、W2S(西--->南)

?

???????2.?当过一定的时间后,有控制器将南<--->北方向上的灯同时变红,然后将

????????? S2W(南--->西)、N2E(北--->东)这两条路线上的灯变绿,此时可通行的

??????????路线依然是6条也就是这两条和不受信号灯控制的那4条转弯的路。

????????

??????3. 再过一定的时间后,由控制器将S2W(南--->西)、N2E(北--->东)这两条

????????? 路线上的灯变红,再将E2W(东--->西)、W2E(西--->东)这两条路上的灯

????????? 变绿,此时可通行的路线也是6条,这两条加上不受信号灯控制的4条。

?????

??????4. 再过一定的时间后,由控制器将再将E2W(东--->西)、W2E(西--->东)这

????????? 两条路上的灯变红,将E2S(东--->南)、W2N(西--->北)这两条路线上的

????????? 变绿,此时可通行的路线依然是6条,这两条加不受信号灯控制的4条。

?

????? 5. 再过一定的时间后,由控制器将E2S(东--->南)、W2N(西--->北)这两条

????????? 路线上的变红,再将?S2N(南--->北)、N2S(北--->南)这两条路上的灯变

??????????绿,就这样由控制器来回切换这4组灯。

?

?

?? 如果就这样进行编码,必然会很复杂,为了对系统进行简化,可发现8个灯当

?? 中,路口与路口相对的灯在同一时间内都处于相同的状态(即就是同时变绿或同

?? 时变红),这时只需考虑4条路线上灯的切换即可:

?

?????????????? ---> S2N(南--->北)

????????????? ?---> S2W(南--->西)

????????????? ?---> E2W(东--->西)

????????????? ?---> E2S(东--->南)

?

???? 而其他路线上的灯都与之相对应,下面分析各个类的详细设计:

?

?????Road类的设计:

?

???????????????? ---> 在Road类中存在一个name属性,用于表示路线的名称。

???????????????? ---> Road类中还有一个vehicles的集合,用于保存车辆。

???????????????? ---> Road类中存在一个带有1个参数的构造方法,即需要传入路线

????????????????????????名称,在该构造方法中启动一个线程,向集合中添加车辆,同

???????????????????????? 时还有一个定时器,?每隔一秒就检查一下该方向上的灯是否为

?????????????????????????绿,如果为绿就将集合中的车辆移除同时打印该过程。

????

?????Lamp类的设计:

?

????????????????---> 将该类设计成了一个枚举类,以便操作更加方便,此枚举类有12

??????????????????????? 元素,即分别表示12个灯,从上面的分析可发现8个灯是两两对

??????????????????????? 应的,此类中存在一个属性opposite,用来表示每一个灯所对

??????????????????????? 应的灯。

??????????????? --->? Lamp类中存在一个含有3个参数的构造方法,参数分别为

?????????????????????????opposite,lighted,next。

??????????????? --->? Lamp类中存在一个属性next表示下一个灯。

??????????????? --->? Lamp类中存在一个boolean属性lighted,表示灯的状态(

?????????????????????????是红色还是绿色)。

??????????????? --->? Lamp类中存在两个方法light()方法将灯变绿,lightOut()方法

???????????????????????? 将灯变红。

??????????????? --->? 为了避免当在红绿灯之间切换时进入死循环,将其中的4个灯对

???????????????????????? 应的灯设为null(N2S,N2E,W2E,W2N)。

?

?????LampController类的设计:

?

??????????????? ---> LampController类中存在一个属性currentLamp表示当前的灯

?

?

????????????????---> 在构造方法中先初始一个灯为当前灯并将其变绿,然后启动一个

??????????????????????? 每隔10秒中将当前的灯变红,并将下一个灯变绿。

?

??????

?

??

????????最后设计一个含有主方法的测试类,实例化12个灯,以及实例化控制器。

?

????????具体的实现代码见黑马程序员_交通灯管理系统(二)

?

?

?

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

?

详细请查看:http://edu.csdn.net/heima


?

读书人网 >编程

热点推荐