public enum Lamp {
/**
* 代码解析: 12条路线就有了12个灯, 根据前面的图可以知道, 灯其实是4组,
*
* 第一组方向是由南向北, 对应的路线是N To S ,这组共用了一个交通灯, 灯的名字是S2N ,直线
*
* 第二组方向是由南向西, 对应的路线是N to E, 这组属于左拐,
*
* 第三组方向是由东向西, 对应的路线是W To E, 这组属于平行,
*
* 第四组方向是由东向南, 对应的路线是S To N, 这组属于左拐,
*
* 那么,第二轮开始的对应的路线, 由于对应的路线没有它自己的交通灯(因为它是跟对应路线公用了交通灯),
*
* 他也没有下一个路线, 因为对应路线是被方向线控制的
*
* 4条右拐路线不受交通灯的限制,可以随意走动.
*/
//方向路线4组
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); //4个右拐路线
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 gree(){
this. lighted = true;
if( opposite != null){ // 对应路线与方向路线共享一个灯, 所以, 由南向北执行 同时由北向南也会执行
Lamp. valueOf( opposite). gree(); //所以如果对应路线如果不为空, 那么对应路线的灯应该也设置成绿灯
}
System. out. println( name() + "灯来了, 开始检查拉!!!!"); //所以会有2个绿灯显示亮了
}
public Lamp red(){
this. lighted = false;
if( opposite != null){ //那么同理, 当方向路线关闭了,对应肯定要关.
Lamp. valueOf( opposite). red();
}
Lamp nextLamp = null;
if( next != null){
nextLamp = Lamp. valueOf( next); //这里要将下个灯获取出来再返回给控制器..
//因为我们要做的是按照顺序切换各个灯, 那么由于灯做了切换,但是没有返回命令给灯控制器
//灯控制器又不知道你做了切换, 所以, 这里将下一个灯返回
System. out. println( "这个路口的" + name() + "灯结束了,下个路口" + next + "开始检查");
nextLamp. gree();
}
return nextLamp;
}
}
public class LampController {
private Lamp currentLamp;
public LampController() {
currentLamp = Lamp. S2N; //灯控制器里有一个默认灯,
currentLamp. gree(); //默认灯亮了, 那么车子开始检查要通过了..
ScheduledExecutorService timer2 = Executors. newScheduledThreadPool( 1);
timer2. scheduleAtFixedRate(
new Runnable() {
@ Override
public void run() {
//将当前灯返回回来,就变成了下个路口的灯
//每隔10秒就切换一次灯,切换灯就是将当前灯关闭,然后下一个灯亮起
currentLamp = currentLamp. red();
}
},
10,
10,
TimeUnit. SECONDS);
}
}
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"
};
for ( int i = 0; i < directions. length; i ++) {
new Road( directions[ i]); //12条路线
}
new LampController(); //灯控制器
}
}