---------------------- android培训、java培训、期待与您交流! ----------------------
交通灯管理系统的需求分析:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
……
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
谁拥有数据,谁就对外提供操作这些数据的方法。
面向对象的设计需求,先要分析对象
初步分析 会有四个对象
1.路线
Road 表示路线,一共有12条路线,每一条的路线名字是不同的,所以要创建Road的12个实例对象.
路线要具备的方法:
增加车辆
减少车辆
2.红绿灯
Lamp类来表示交通灯,因为有12条路线,所以一共就有12交通灯来表示路线,因为右拐弯不受灯的限制,但是为了让系统有统一的管理方式,假如四个右拐弯有交通灯,四个交通的状态是常亮的。
除了右拐弯的灯以后,还有八个交通灯,因为交通灯的是两两相对的,所以可以分成四组,从这四组中各取出一个灯来控制,与这个灯对应的灯,的状态随着控制灯的变换而变换。
假如:由南道北的灯是亮的
对应的灯: 由北到南的灯也是亮的
下一个灯: 由南到西的灯是不亮的
对应的灯: 由北到东的灯是不亮的
3.红绿灯控制器
lampController类 来表示交通控制器,因为控制器是单一的,最好是用单例模式来设计,也可以用枚举来实现。
4.汽车
因为只需要捕捉汽车瞬间移过路口,所以汽车的设计可以用字符串表示。
//路线
public class Road {
private List<String>vehicle=new ArrayList<String>();
String roadName;
public Road(String roadName){
this.roadName=roadName;
//用 Executors newSingleThreadExecutor()创建多线程 用 execute()启动run()方法里面的代码
ExecutorService execSer= Executors.newSingleThreadExecutor();
execSer.execute(new Runnable(){
public void run(){
try {
Thread.sleep(new Random().nextInt(10)+1*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0;i<1000;i++){
vehicle.add(Road.this.roadName+"方向的车"+i);
}
}
});
//用 Executors 创建定时器 newScheduledThreadPool
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vehicle.size()>0){
boolean lighted=Lamp.valueOf(Road.this.roadName).isLighted();
if(lighted){
System.out.println(vehicle.remove(0)+"车开走 !");
}
}
}
},
1,
1,
TimeUnit.SECONDS );
}
}
路线图片:
//灯
public enum Lamp {
南(S) 北(N) 东(E)西(W)
* 需要控制的等,可以分成四组,单独控制每组灯里的一个。
* 南到北 南到西 东到西 东到南
* 北到南 北到东 西到东 西到北
* 右拐灯:不需要控制,常亮
* 南到东 东到北 北到西 西到南
*
S2N,S2W,E2W,E2S,
N2S,N2E,W2E,W2N,
W2S,S2E,E2N,N2W;
//要控制的四个灯
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),
//右拐弯常亮的四个灯
W2S(null,null,true),S2E(null,null,true),
E2N(null,null,true),N2W(null,null,true);
private Lamp(){};
//因为枚举要先定义后才能使用,所以这就构造函数不直接接收灯的对象,而是接收灯的名字。
private Lamp(String opposite,String lignext,boolean lighted){
this.opposite=opposite;
this.lignext=lignext;
this.lighted=lighted;
}
//接收对应灯的名字
private String opposite;
//接收下一个灯的名字
private String lignext;
//灯的状态
private boolean lighted;
//返回灯的状态
public boolean isLighted(){
return lighted;
}
//灯变亮方法
public void light(){
this.lighted=true;
//让对应的灯变亮
if(opposite!=null)
Lamp.valueOf(opposite).light();
System.out.println("下面可以看到六个方向的灯------------>");
}
//灯变暗方法
public Lamp backlight(){
this.lighted=false;
//让对应的灯变暗
if(opposite!=null)
Lamp.valueOf(opposite).backlight();
//让下一个灯变亮