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

时间:2023-02-17 19:00:14

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

今天从12:15开始学习:

1.开始来学习,先听听张老师的就业指导:

好的,听完张老师的讲说,我都心动了,好好努力学习!

2.开始来学习交通灯系统:

这又是一个月薪7K的模拟交通灯系统。

好的言归正传,我们来看看这个系统的业务需求:

看看图中,总共有12条路线。

我们可以假设每条路线上都有一个红绿灯在对其进行控制。右拐弯有灯吗,没有,我们假设有一个常绿的灯在那里,这样是为了统一模型。如果我们想成右拐弯没有灯,那么这个程序就复杂了@

车不看自己什么方向,只看自己的灯。

3.我们来看看这个具体的项目需求:

Ø 异步随机生成按照各个路线行驶的车辆。

例如:

       由南向而来去往北向的车辆 ---- 直行车辆

       由西向而来去往南向的车辆 ---- 右转车辆

       由东向而来去往南向的车辆 ---- 左转车辆

       。。。

如果我们就这样不假思索的做,那么会变得很复杂,我们可以先只考虑南的。

所以写呢,可以先写由南向北,由南向东,由南向西。

Ø 信号灯忽略黄

Ø 

Ø 

Ø 

Ø 灯,只考虑红灯和绿灯。

Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

目前学了50分钟!

现在从13:19开始学习:

4.注意看图,南北向车辆和东西向车辆是交替放行的,比如先是南向北直行,直行完之后,右转是不用管的,始终是亮着的,接着就是南向西拐,此时西出发的不能动,等到南的走完了,才可以走。

Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

5.接下来,我们就要来进行面向对象的分析和设计了:

我们先来想想我们有哪些对象呢?

首先要有灯,红绿灯,还有灯之间要进行变换的切换,是不是需要一个控制系统。控制四组灯的来回切换,接着还有汽车,还有路线。汽车看到前面的灯绿了,是否就可以穿过路口了,不是,还得看看其前面是否有车。看前面有没有车,问路,因为路是存储汽车的集合,那么路就应该有增加和减少车辆的方法了。

面向对象的一个很重要的经验就是,谁拥有数据,谁就对外提供操作这些数据的方法。

这个路上有很多汽车,它随时会增加汽车,也随时会减少汽车,这个汽车增加减少的方法是谁提供的,是路。

我们并不是要体现车移动的过程,只是捕捉车辆穿过路口的过程,也就是捕捉减少一辆车的过程,所以这个车不用专门设计成一个类,只要用一个字符串表示就可以了!

6.讲到这里,我们就来加深一下面向对象设计:

石头磨成石刀,石刀砍树,砍成木材,木材做成椅子。

利用面向对象的方法来分析:

我们可以这样做——

Stone

StoneKnife

Tree

Material

Chair

首先石头磨成石刀,那么这个方法肯定不是石头自己的方法,因为它自己都没了:

有一个石刀加工厂接收石头将其加工成石刀。

StoneKnife=KnifeFactory.createKnife(stone)

同样,石刀砍树,这个方法是石刀的:

Material=KnifeFactory.cut(tree)

木材变成椅子,木材都没有了,所以肯定不是它自己的方法,是椅子加工厂的:

Chair=ChairFactory.make(material)

7.接下来,我们来看看,我们的程序还要怎么设计:

我们要设计lamp对象,我们这里有12个灯。右拐弯有没有灯,有,在现实生活中没有,我们这边加上,所以有12个灯。这个灯是固定的,就是12个,所以我们想到了用枚举。我们只设计4个灯,总共有12个灯,但是只有4个灯有逻辑。当这个灯变亮的时候,它对应方向上的灯也变亮。当这个灯变暗的时候,它对应方向上的灯也变暗,下一个方向上的灯与其相反。所以一个连带出了三个,只要四个有逻辑就可以了。

所以我们发现这个灯就有两个变量,一个是对面的灯,一个是下一个灯。当然还有一个就是自己的状态。

这是灯的设计,接着是灯的控制系统的设计:

有一个变量,当前绿的灯是哪一个。

学了1小时50分钟

8.现在来接着学习:从14:32开始学习——

刚刚我们理了一下思路,现在对思路不需要完全地清楚,只需要有那么一点朦朦胧胧的印象就可以了。

现在我们来通过写代码加深理解。

我们首先来编load类。

建立工程:交通灯管理系统。

接着我们要建一个包:com.isoftstone.interview.traffic

新建一个类:Road.java

package com.isoftstone.interview.traffic;

import java.util.ArrayList;

import java.util.List;

public class Road {

//首先在这个路上有很多车,我们要定义一个车的集合

private List<String> vehicles=new ArrayList<String>();

//然后我们要知道是哪条路上的哪辆车

private String name;

public Road(String name){//构造方法

this.name=name;

//接着我们要随机产生车,在这个构造方法里面来做,假设有999辆车

for(int i=1;i<1000;i++){

vehicles.add(name+":"+i);//调用它增加车

}

}

}

9.接着我要让路上每隔1-10秒产生一辆车,使用线程。

package com.isoftstone.interview.traffic;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.Executors;

public class Road {

//首先在这个路上有很多车,我们要定义一个车的集合

private List<String> vehicles=new ArrayList<String>();

//然后我们要知道是哪条路上的哪辆车

private String name;

public Road(final String name){//构造方法

this.name=name;

//接着我们要随机产生车,在这个构造方法里面来做,假设有999辆车

Executors.newSingleThreadExecutor().execute(new Runnable(){

public void run(){

for(int i=1;i<1000;i++){

try {

Thread.sleep((new Random().nextInt(10)+1)*1000);

catch (InterruptedException e) {

e.printStackTrace();

}//让它在1-10秒内产生一辆车

vehicles.add(name+":"+i);//注意,这里是内部类使用外部类的成员变量,要将成员变量申明为final

 

}

}

});

}

}

那么车开到路上来的代码我们就写完了!!!

10.上面是车开到路上的代码,它还要每隔一秒看看灯是否是绿的,如果是绿的,那么就把第一辆车挪走。

我们这里要用定时器。就是从什么时候开始,每隔多长时间又要做什么。就不用线程了。

});

//这里来定义一个定时器

ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);//它返回的类型是ScheduledExecutorService

timer.scheduleAtFixedRate(//为什么要用这个呢,我们希望每隔1秒去看看灯,是一个频率

new Runnable(){

public void run(){

}

},

1,//1秒之后要干上面run里面的事

1, //1秒之后接着干

TimeUnit.SECONDS);

}

}

11.

});

//这里来定义一个定时器

ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);//它返回的类型是ScheduledExecutorService

timer.scheduleAtFixedRate(//为什么要用这个呢,我们希望每隔1秒去看看灯,是一个频率

new Runnable(){

public void run(){

//在这里面我们要来判断一下,如果有车,我们才干事

if(vehicles.size()>0){

//我们先假设定义一个灯,因为现在我们还没有定义灯

 boolean lighted=true;

 if(lighted==true){

System.out.println( vehicles.remove(0)+"is traversing");//我们调用它移去第一辆车,那么它返回的值就是第一辆车,将其打印出来

 }

}

}

},

1,//1秒之后要干上面run里面的事

1, //1秒之后接着干

TimeUnit.SECONDS);

}

}

这里要猛烈批评一个错误:本来就设定了boolean lighted=true,我们还要去写lighted==true;

不用了,直接if(lighted)

好的,那么这个路就做完了!!!!

12.我还是来把路的代码自己不看资料重新写一遍。

package com.isoftstone.interview.traffic;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class Road {

private List<String> vehicles=new ArrayList<String>();

private String name;

public Road(final String name){

this.name=name;

Executors.newSingleThreadExecutor().execute(new Runnable(){

public void run(){

for(int i=1;i<1000;i++){

try {

Thread.sleep((new Random().nextInt(10)+1)*1000);

catch (InterruptedException e) {

e.printStackTrace();

}

vehicles.add(name+":"+i);

}

}

});

//这里来定义一个定时器

ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);//它返回的类型是ScheduledExecutorService

timer.scheduleAtFixedRate(//为什么要用这个呢,我们希望每隔1秒去看看灯,是一个频率

new Runnable(){

public void run(){

//在这里面我们要来判断一下,如果有车,我们才干事

if(vehicles.size()>0){

//我们先假设定义一个灯,因为现在我们还没有定义灯

 boolean lighted=true;

 if(lighted){

System.out.println( vehicles.remove(0)+"is traversing");//我们调用它移去第一辆车,那么它返回的值就是第一辆车,将其打印出来

 }

}

}

},

1,//1秒之后要干上面run里面的事

1, //1秒之后接着干

TimeUnit.SECONDS);

}

}



---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------