---------------------- android培训、java培训、期待与您交流! ----------------------
黑马程序员-交通灯管理系统
交通灯管理系统
需求:
1异步随机生成按照各种路线行驶的车辆。
如:E2S.N2E等
2信号忽略黄灯。只考虑红绿灯。
3.应考虑左转车辆控制信号灯,右转车辆不收信号灯控制。
4具体信号灯逻辑与实现生活中普通交通控制,不考虑特殊情况。
5每辆车通过路口的时间为1秒。
6随机生成车辆时间间隔,以及红绿灯时间间隔自定,可以设置。
7不许实现GUI,只考虑逻辑实现。
思想:
我们初步设想一下有哪些对象:红绿灯,,红绿灯的控制系统,汽车,路线,汽车看到自己所在路线的绿灯亮了就穿越路口吗,不是,还需要看前面是否有车,看前面是否有车该问那个对象,,该问路,路中存储车辆的集合,显然路上应该有增加车辆和减少车辆的方法,根据题目,我们这里并不是体现车辆移动的过程,只是捕捉车辆穿越路口的过程,也就是捕捉路上车辆减少的过程,所以,这个车并不需要单独设计为一个对象,用一个字符串表示就可以
面向对象设计把握一个重要的经验,谁拥有数据,谁就对外提供操作这些数据的方法,在牢牢掌握几个典型的案例就可以了,例如:人在黑板上面画圆,汽车死机刹车等。售货员统计收获小票金额,你把门关上。
两块石头磨成一把石刀,石刀可以砍树,堪称木材,木材做成椅子。
球从一根绳子的一端移动到另一端。
每条路线上都会出现多辆车,路线上要随机增加新的车,在绿灯期间还要美妙煎熟一辆车。
设计一个Road来表示路,每个Road对象来表示一条路线共12条路线,及系统中总共产生12个Road的示例对象。
每条路线中随机增减新的 车辆,增加到一个集合中保存。
每条路线买个一秒都会检查控制本路线的灯是否为绿。是则兼本条路线保存车的集合总共的第一个车辆移除,记表示穿越了路口。
定义一个类表示路
package com.isoftstone.interview.traffic;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
List<String> vechicles=new ArrayList<String>();
private String name=null;
//在路上不断的产生汽车
public Road(String name){
this.name=name;
//创建一个线程池,从线程池中选一条线程启动
ExecutorService pool=Executors.newSingleThreadExecutor();
//启动一条线程。execute的参数是一个Runnable接口
pool.execute(new Runnable(){
//实现Runnable接口i,并覆盖run方法
public void run(){
//自动生成1000辆车
for(int i=1;i<1000;i++){
try {//生成时间的间隔是随机的,使用Random类的nextInt方法,生成1-10的随机数,乘以1000,得到1-10s的随机时间
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (Exception e) {
e.printStackTrace();
}//把生成的汽车添加到路上。
vechicles.add(Road.this.name+"—"+i);
}
}
});
//定义一个定时器,调度的意思,调度池大小1
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
//定时器,根据固定频率进行做事
timer.scheduleAtFixedRate(new Runnable(){
public void run(){
//检查路上有没有车,
if(vechicles.size()>0){
//定义一个变量代表灯,内部类用到外部类中的名字,用外部类名.this.name
boolean lighted=Lamp.valueOf(Road.this.name).isLighted();//得到这个灯
if(lighted){//如果前面的灯是亮点,那么就移除第一辆车。remove方法将返回取走的车
System.out.println(vechicles.remove(0)+" is traversing!");
}
}
}
},
1,//过多少秒做这件事
1,//做完以后再过多少时间再做一次
TimeUnit.SECONDS);//设置前面参数的度量单位。
//定时器,参数Runnable对象
/*timer.schedule(new Runnable(){
},
delay, //过多长时间以后做一件事
unit);*/
}
}
定义每一条路上面对应的灯
package com.isoftstone.interview.traffic;
public enum Lamp {
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);
private Lamp(String opposite,String next,boolean lighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
private Lamp(){}//添加一个不带参数的构造方法
private boolean lighted;//定义一个变量,用于记住灯的状态
private String next;//下一个灯
private String opposite;//对面的灯
//判断灯当前的状态
public boolean isLighted(){
return lighted;
}//灯变亮的方法
public void light(){
this.lighted=true;
if(opposite!=null){//如果有对应的灯,就让对应的灯亮,以免进入死循环
Lamp.valueOf(opposite).light();//枚举的valueof方法,给他名字返回枚举对象,通过对象调用light();
}
System.out.println(name()+"lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}
//灯变黑的方法
public Lamp blackOut(){
this.lighted=false;
if(opposite!=null){//如果有对应的灯,就让对应的灯亮,以免进入死循环
Lamp.valueOf(opposite).blackOut();//枚举的valueof方法,给他名字返回枚举对象,通过对象调用light();
}
Lamp nextLamp=null;
if(next!=null){//灯灭以后如果有下一个灯,就让下一个灯变亮
nextLamp=Lamp.valueOf(next);
System.out.println("绿灯从"+name()+"------->转换为"+next);
nextLamp.light();
}
return nextLamp;//返回新变绿的灯
}
}
定义一个灯的控制器
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 timer=Executors.newScheduledThreadPool(1);
//使用定时器的scheduleAtFixedRate方法。
timer.scheduleAtFixedRate(new Runnable(){
public void run(){//把当前灯改为新变绿的灯。
currentLamp=currentLamp.blackOut();
}
},
10, 10, TimeUnit.SECONDS);
}
}
写一个主类,创建路的对象,和开启灯的控制器
package com.isoftstone.interview.traffic;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
String[] directions=new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
//定义12条路,定义为不同的名字
for(int i=0;i<directions.length;i++){
new Road(directions[i]);
}
new LampController();//打开灯的控制器
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------