黑马程序员---交通灯管理系统的总结与改进

来源:互联网 发布:c语言入门教程txt 编辑:程序博客网 时间:2024/06/03 17:33
------------Android培训、Java培训、期待与您交流----------

交通灯管理系统设计与分析
 
Road类的分析与设计
 
每条路口上都会出现多辆车,路线上会随机增加车辆,在路口绿灯期间还要每秒钟减少一辆车
1) 设计一个road类表示路线,共有12条路线,就会产生12个road对象
2) 每条路线上随机增加新的车辆,增加到一个集合中保存
3) 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是的话把本路线集合中德第一辆车移除,即表示车穿过了路口。
具体实现代码如下:
/* * 1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表 *   每个方向上的车辆集合。 * 2.在Road对象的构造方法中启动一个线程每隔一个随机的时间想vehicles集合中增加 *   一辆车 * 3.在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿, *   是则打印车辆集合并将集合中的第一辆车移出。 *  */package com.intel.traffic;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Road {private List<String> vechicles = new ArrayList<String>();private String name = null;public Road(String name){this.name = name;ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable() {public void run(){for(int i = 1 ; i < 500 ; i++){try {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 lightstatus = Lamp.valueOf(Road.this.name).lightStatus();if(lightstatus){System.out.println("Vehicles in "+vechicles.remove(0)+" is traversing!!!");}}}}, 1, //initialDelay1, //periodTimeUnit.SECONDS);//unit}}
 
Lamp类的分析与设计
 
每条路线每隔一秒都会检查控制本路线的灯是否为绿灯,如果一个灯由绿变红时,应该将下一个方向的灯变绿
1) 设计一个lamp类来表示一个交通灯。每个交通等都在做红绿灯切换(改进后加入了黄灯),每个交通灯都要有变绿和变红的方法,且能自动切换
2) 对应12条路线要产生12个交通灯。右拐弯的路线可以不受灯的控制,但是为了让程序采用统一的处理方式,假设四个右拐弯等一直保持常量状态
3) 除了右拐弯方向的其他8条路线的灯,他们是两两成对出现的,可以归为四组。所以,在编程处理时,只要从这4组中各取出一个灯进行变化即可。
4) 无论在程序什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以lamp类改用枚举来做显示具有很大的方便性。
具体实现代码如下:
package com.intel.traffic;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(String opposite, String next , boolean lightstatus){this.opposite = opposite;this.next = next;this.lightstatus = lightstatus;}private Lamp(){}private boolean lightstatus;private String opposite;private String next;public boolean lightStatus(){return lightstatus;}public void lightOn(){this.lightstatus = true;if(opposite!=null){Lamp.valueOf(opposite).lightOn();}System.out.println(name()+" lamp is green...Vehicles come from 6 directons...");}public Lamp lightOff(){this.lightstatus = false;if(opposite!=null){Lamp.valueOf(opposite).lightOff();}Lamp nextLamp = null;if(next!=null){nextLamp = Lamp.valueOf(next);System.out.println("Green lights "+name()+"/"+opposite.toString()+" ...are turning to... "+next+"/"+Lamp.valueOf(next).opposite.toString());nextLamp.lightOn();}return nextLamp;}}

LampController类的分析与设计
1) 整个系统中只能有一套交通灯控制系统,所以LampController类最好是设计为单例模式,始终保持一个对象的存在。而别的类无法创建对象。
2) LampController的构造方法中要设定第一个为绿的灯
3) LampController对象的start方法中将当前的灯变绿,然后启动一个定时器,每个10秒将当前等变红和下一个灯变绿
4) 在当前灯由红变绿的过程中,现实中应该有一个黄灯的过度期,且在黄灯过度时,当前两个相应路口的车辆还应该是穿过状态,知道有绿灯变为红灯为止
运行结果下:
Vehicles in S2N_1 is traversing!!!Vehicles in S2E_1 is traversing!!!Yellow light in 3 Seconds...Vehicles still Traversing...Vehicles in S2N_2 is traversing!!!Vehicles in N2S_2 is traversing!!!Vehicles in N2W_1 is traversing!!!Vehicles in W2S_1 is traversing!!!Vehicles in S2E_2 is traversing!!!Vehicles in N2W_2 is traversing!!!Green lights S2N/N2S ...are turning to... S2W/N2EN2E lamp is green...Vehicles come from 6 directons...S2W lamp is green...Vehicles come from 6 directons...Vehicles in S2W_1 is traversing!!!Vehicles in N2E_1 is traversing!!!

具体实现代码如下:
package com.intel.traffic;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampController{private Lamp currentLamp;public LampController(){currentLamp = Lamp.S2N;currentLamp.lightOn();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {public void run() {System.out.println("Yellow light in 3 Seconds...Vehicles still Traversing...");try{Thread.sleep(3000);}catch (InterruptedException e) {e.printStackTrace();}currentLamp = currentLamp.lightOff();}},10, 10, TimeUnit.SECONDS);}}

MainClass类的编写
1) 用for循环创建出代表12条路线的对象
2) 接着获得LampController对象并调用其start方法。
 具体实现代码如下
 
package com.intel.traffic;import java.awt.List;import java.util.ArrayList;public class MainClass {public static void main(String[] args) {String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};new LampController();for(int i = 0 ; i < directions.length ; i++){new Road(directions[i]);}}}

------------Android培训、Java培训、期待与您交流----------