------------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, //initialDelay
1, //period
TimeUnit.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/N2E
N2E 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培训、期待与您交流----------