本文是基于张孝祥Java视频做的总结,本人新手,不喜勿喷
需求
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 —- 直行车辆
由西向而来去往南向的车辆 —- 右转车辆
由东向而来去往南向的车辆 —- 左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析
涉及到的对象有:车辆、交通灯、交通灯控制器、以及路线。
由于是模拟交通灯管理逻辑,我们可以用字符串代替车辆来模拟这个过程
车是否通过路口是通过交通灯决定的,所以每个路线对应一个交通灯,为了统一编程,右转路线也加入交通灯,只不过状态一直为绿灯即可
这样就有12条线路,对应12个交通灯
下面我们来看路口通行图示
可以看到画相同线条的路线上的交通灯其实是同步的,由南向北与由北向南的灯应该同时绿,同时红,又由于右转灯维护为常绿,所以,需要交通灯控制器控制的灯,其实只有4个,分别是图中标注1,2,3,4的4条路线上的灯
面向对象设计 交通灯Lamp类设计:
由于交通灯是贯穿整个逻辑的,同时又只存在12个灯的实例对象,所以我们可以设计成枚举
内部维护自己的红绿状态
对外提供改变自己与对应灯状态的方法
路线Road类设计:
每条路线需要有一个自己的名字来注明自己具体是哪条路线
内部还需要维护一个集合类来存放车辆,这里车辆用字符串名称来模拟
运行过程中通过一个定时器每隔一秒来判断自己路线上的灯是否为绿,为绿,则放行,为红,则等待
交通灯管理器LampControler类设计:
内部维护一个迭代器代表路口当前可通行的灯,通过定时器每隔固定时间改变当前灯的状态,并获取下一组灯,使之变绿
实现
Lamp类
Lamp { 2:/** 3: *| N | 4: *|| 5: *|| 6: *|| 7: *|| 8: * ———————————— 9: * 10: * WE 11: * 12: * ———————————— 13: *|| 14: *|| 15: *|| 16: *|| 17: *| S | 18: * */ 19: 20://表示12个路线上的灯 21:S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false), 22:N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false), 23:S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true); 24: 25://对应方向的灯 26:private String oppsite; 27://下一个需要亮的灯 28:private String next; 29://当前状态,true表示为绿light; 31: 32:Lamp(String oppsite,String next,boolean light){ 33:this.oppsite = oppsite; 34:this.next = next; 35:this.light = light; 36:} 37: 38://lightUp表示亮起绿灯lightUp(){ 40: 41:light = true; 42:System.out.println(name()+ " 绿灯亮了"); 43://如果对应灯非空,则同时改变对应方向灯的状态 44:if(oppsite != null) 45:Lamp.valueOf(oppsite).lightUp(); 46:} 47: 48://lightDown表示亮起红灯 49:public Lamp lightDown(){ 50:light = false; 51:System.out.println(name()+ " 红灯亮了"); 52: 53://如果对应灯非空,则同时改变对应方向灯的状态 54:if(oppsite != null) 55:Lamp.valueOf(oppsite).lightDown(); 56://返回下一个方向上的灯 57:if(next != null) 58:return Lamp.valueOf(next); 59:return null; 60:} 61: 62://获得当前状态isLight(){ 64:return light; 65:} 66: }谦受益,满招损。