黑马程序员_交通灯管理系统(一)
??---------------------- 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
?