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