---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
今天晚上从19:14开始学习:
1.先把昨天的交通灯系统的road.java重新写一遍。然后再接着学习后面的知识要点。
2.好的,那么现在我们就来接着学习:
前面呢,我们已经把路做完了,接下来我们就来做灯。
我们这里使用枚举,使用这种新技术是很有用的,可以简化我们的工作。
注意这里所谓的亮就是指绿,所谓的黑就是指红。
package com.isoftstone.interview.traffic;
public enum Lamp {
S2N,S2W,E2W,E2S,//前两行是直行和左拐弯的,第三行是右拐弯的
N2S,N2E,W2E,W2N,
S2E,E2N,N2W,W2S;
private boolean lighted;
public boolean isLighted(){//我们说了boolean类型的is相当于get,也就是说我们在这里覆盖了它的get方法
return lighted;
}
//有一个灯亮的方法
public void light(){
this.lighted=true;
}
public void blackOut(){
this.lighted=false;
}
}
3.我们接着还要让它们对应的灯变亮。
package com.isoftstone.interview.traffic;
public enum Lamp {
S2N,S2W,E2W,E2S,
N2S,N2E,W2E,W2N,
S2E,E2N,N2W,W2S;
private boolean lighted;
//我们需要定义一个对应的灯
private Lamp opposite;
public boolean isLighted(){
return lighted;
}
public void light(){
this.lighted=true;
//如果我们只写这个,很容易是程序陷入一种死循环中,因为它们呢是互相对应的,东对应西,西对应东。
//所以要判断一下,如果有对应的灯
if(opposite!=null){
opposite.light();
}
}
public void blackOut(){
this.lighted=false;
}
}
4.现在既然我有一个对应的灯需要,那么我是不是需要一个对应的变量啊。这个对应的变量怎么给值啊,是不是在构造方法里面给啊。
这个意思就是我这个opposite代表的是什么。
package com.isoftstone.interview.traffic;
public enum Lamp {
S2N("N2S"),S2W,E2W,E2S,
N2S,N2E,W2E,W2N,
S2E,E2N,N2W,W2S;
private Lamp(String opposite)
{
this.opposite=opposite;
}
private Lamp(){
}
private boolean lighted;
private String opposite;
public boolean isLighted(){
return lighted;
}
public void light(){
this.lighted=true;
if(opposite!=null){
Lamp.valueOf(opposite).light();
}
}
public void blackOut(){
this.lighted=false;
}
}
我们如何定义这个对应的灯的变量呢?在最上面的括号里面加上它对应的灯的名字,不是变量,是String名字,这样才可以通。
然后写一个构造方法,注意枚举里面的构造方法都是private的。
将变量名传进去。这个是带参数的构造方法,是专门给S2N("N2S")用的。然后还要有一个无参数的构造方法,是给其他的11个用的。最后再if判断语句中,可以用枚举类名调用valueOf方法,接收这个opposite,再调用light方法。
5.这里要注意了,我们还要把下一个灯变成相反的状态,还有灯初始的时候是亮的还是暗的。
package com.isoftstone.interview.traffic;
public enum Lamp {
S2N("N2S","S2W",false),S2W,E2W,E2S,
N2S,N2E,W2E,W2N,
S2E,E2N,N2W,W2S;
private Lamp(String opposite,String next,boolean lighted)
{
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
//把无参数的构造方法去掉,一个个写
private String next;
我们把无参数的构造方法去掉:
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);
6.对应的灯是同黑同亮的。
public void blackOut(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
if(next!=null){//如果有下一个灯,我们把下一个灯变绿
Lamp.valueOf(next).light();
}
}
}
我这样做完了。
好的,关于灯我也做完了。
现在我们再回过头来看我们的路。
if(vehicles.size()>0){
//boolean lighted=true;怎么知道这个路对应的灯呢,把路的名字传进去
boolean lighted=Lamp.valueOf(name).isLighted();//我们用枚举的方法
7.现在路也改完了,灯也改完了,接着就是要搞一个灯的控制器。
package com.isoftstone.interview.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.light();
//每隔十秒钟就要把当前的灯变黑
ScheduledExecutorService pool=Executors.newScheduledThreadPool(1);
pool.scheduleAtFixedRate(new Runnable(){
public void run(){
currentLamp=currentLamp.blackOut();//让当前的灯变黑
}
},
10,
10,
TimeUnit.SECONDS);
}
}
public Lamp blackOut(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp=Lamp.valueOf(next);
if(next!=null){
nextLamp.light();
}
return nextLamp;
}
8.我们写这个MainClass.java
package com.isoftstone.interview.traffic;
public class MainClass {
public static void main(String[] args) {
//我们要new 12个路,先定义一个数组
String[] directions=new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(int i=1;i<directions.length;i++){
new Road(directions[i]);
}
//接下来我们要new一个控制器
new LampController();
}
}
我们来看看运行结果:
好的,已经成功!!!!
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------