黑马程序员-交通灯系统2

来源:互联网 发布:日语语法书推荐 知乎 编辑:程序博客网 时间:2024/05/19 22:01

---------------------- <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>、期待与您交流! ----------------------

原创粉丝点击