------- 、、期待与您交流! ----------
1 交通灯管理系统
1.1需求
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1> 异步随机生成按照各个路线行驶的车辆。一共有四个路口,每个路口都有自己的方向(直行,左转,右转)
2> 只考虑红灯和绿灯,可以不考虑黄灯。
3> 右转的灯默认是开的(绿的)。
4> 信号灯的控制与生活中普通交通灯相同,东西方向,南北方向交替放行。
5> 设定每辆车通过路口时间为1秒(可用线程Sleep的方式模拟)。
6> 可以自行设定车辆产生的时间间隔和红绿灯之间的时间间隔。
1.2 思路
总共有12条路线,假设每条路线都有一个信号灯对其进行控制,右转的4条路线的控制灯可为常绿状态,其他的8条线路是两两对应(一个是绿的,另一个就是红的),分为4组,只需考虑4条路线(两个相邻路口的左转和直行)的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换.初步设想有红绿灯,红绿灯控制系统,路和车的对象。红绿灯控制系统控制四组灯的亮灭,路和灯绑定,每条路线上都不断的产生车辆,。在绿灯的时候,如果这辆汽车是该路线上第一辆则通过,否则等待它成为第一辆车时才能通过,通过之后,路线将这辆车删除。
1> 设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。Road类中需要提供能够处理每条路线上随机增加新的车辆,增加到一个集合中保存。每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
2>设计一个Lamp类来表示交通灯,每个交通灯都维护一个状态:绿或红,每个交通灯要有变亮和变黑的方法,亮黑状态是交替的。总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线默认为绿,其他8条路线,分为4组(因为两两对应的),从这4组中各取出一个灯,对这4个灯依次变亮变黑,与这4个灯对应的灯随之一同变化,类中要有一个变量来记住自己相反方向的灯,某个变亮或暗,对应的灯也变黑和变亮。每个灯变黑时,下一个灯的变亮,类中还要有一个变量来记住自己的下一个灯。本类用枚举来做具有很大的方便性,只有代表12个方向的灯的实例对象。
1.3 设计一个LampController类,它定时让当前的绿灯变红。
1.4.设计一个MainClass类,测试程序。
1.5 代码:
1>Road类
public class Road {
List<String> vechicles = new ArrayList<String>(); private String name; public Road(String name) { this.name = name; //----这是将路和灯绑在起的 //----在1到10秒内产生一两个辆车子 ExecutorService pool = Executors.newSingleThreadExecutor(); pool.execute(new Runnable() { public void run() { for(int i=1;i<1000;i++){ try { //----从1到10随机产生一个数 Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) { e.printStackTrace(); } vechicles.add(Road.this.name+"_"+i); } } }); ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable(){ public void run(){ //----路上有车,且灯是绿的.第一辆车可以通过 if(vechicles.size()>0){ boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); if(lighted){ System.out.println(vechicles.remove(0)+" is traveling");//----通过之后将车辆从中上删除. } } } }, 1, 1, TimeUnit.SECONDS); }}
2> Lamp类
public enum Lamp { //-----定义好十二条路线,每条路线包含的信息有,对应的路线的灯的状态,以及下一条路线的灯的状态.
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false), N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false), S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true); private Lamp(){ } //---对象枚举的初始化. private Lamp(String opposite,String next,boolean lighted){ this.opposite = opposite; //---记录对应的个灯 this.next = next; //---记录下一个灯 this.lighted = lighted; //---记录本灯对象的状态 } private boolean lighted; private String opposite; private String next; public boolean isLighted(){ return lighted; //----获取灯的状态 } public void light(){ //---如灯是亮的,则对应的灯也是亮的 this.lighted = true; if(opposite != null){ Lamp.valueOf(opposite).light(); } System.out.println(name()+" lamp is green,下面应该有可以看有六个方向的车通过."); } public Lamp blackOut(){//---如灯是黑的,则对应的灯也是黑的 this.lighted = false; if(opposite != null){ Lamp.valueOf(opposite).blackOut(); } Lamp nextLamp =null ; if(next != null){ nextLamp = Lamp.valueOf(next); System.out.println("绿灯从"+name()+"---切换为"+next); nextLamp.light();(){//---如灯是黑的,则下一个灯是亮的 } return nextLamp; }}3>LampController类
public class LampCotroller {
private Lamp currentLamp; public LampCotroller(){ currentLamp = Lamp.S2W; //---设置当前的灯产S2W, ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable() { public void run() { currentLamp = currentLamp.blackOut(); } }, 10, 10, TimeUnit.SECONDS); } }4>MainCalss类
public class MainClass {
public static void main(String[] args) {
String[] derectios = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
for(int i=0;i<derectios.length;i++){
new Road(derectios[i]); } //----创建十二条路线的对象
new LampCotroller(); } //---开启信号灯管理系统
}
1.6 收获
写代码之前的分析,流程模拟很重要,流程不懂的话,根本就无写代码.还有就是面向对象的思想还有待于加强,之前要本就没有想到将路和灯绑在一起.