----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------交通灯管理系统
对象分析:
路
灯
控制器
对象的变量和方法分析:
路
变量:车
方法:增加、减少车辆
灯
变量:12种不同路线的灯,其中向右转的4条路线的灯看成永远是绿灯
方法:开灯(开灯的时候需开启相对的灯)、关灯(关灯的时候要开启下一个灯,还需返回下一个灯,因为在控制器中有一个固定频率的转换灯状态的方法,需要获得下当前灯(即上面说的下一个灯))
因为是固定的12种不同路线的灯,所以这里需定义为枚举类
剩下的8种不同路线的灯因为是相对的关系,所以可以看成是4组等,开灯的时候若有相对的等,则开启
控制器
方法:启动一个线程池,根据固定的频率变换灯的状态
Lamp:灯
LampController:灯控制器
Road:路
RunTraffic:启动模拟交通灯管理系统
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.youkuaiyun.com
对象分析:
路
灯
控制器
对象的变量和方法分析:
路
变量:车
方法:增加、减少车辆
灯
变量:12种不同路线的灯,其中向右转的4条路线的灯看成永远是绿灯
方法:开灯(开灯的时候需开启相对的灯)、关灯(关灯的时候要开启下一个灯,还需返回下一个灯,因为在控制器中有一个固定频率的转换灯状态的方法,需要获得下当前灯(即上面说的下一个灯))
因为是固定的12种不同路线的灯,所以这里需定义为枚举类
剩下的8种不同路线的灯因为是相对的关系,所以可以看成是4组等,开灯的时候若有相对的等,则开启
控制器
方法:启动一个线程池,根据固定的频率变换灯的状态
Lamp:灯
/*
* 灯
* 共12种路线,即12种灯,向右转这种特殊方式把他看成绿灯,一直可通行
* 另外8种灯是相对的,可以看成是4组,当灯亮时,对应的灯也亮,关闭也是同理
* 灯关闭的时候,下一个路口的等就要变亮
* 变亮=绿灯
* 关闭=红灯
* 这里不考虑黄灯
*/
package cn.itcast.Mr_Zhang.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 boolean lighted;
//相对应的灯
private String opposite;
//下一个灯
private String next;
private Lamp(String opposite, String next, boolean lighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
//检查灯的状态
public boolean isLighted(){
return lighted;
}
//亮灯操作,若存在相对的等,则相对的等也需要亮灯
public void light(){
this.lighted=true;
if(opposite!=null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+"变为绿灯,共有6个方向可以通行");
}
//关灯操作,关闭此等后需要吧下一个灯点亮,这里需要返回下一个灯,因为在LampController中,每10秒关闭灯,开启下一个灯,需要将nextLamp赋值给currentLamp
public Lamp closeLight(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).closeLight();
}
Lamp nextLamp = null;
if(next!=null){
nextLamp=Lamp.valueOf(next);
System.out.println(name()+"灯变红,下一个灯:"+next+"变绿灯");
nextLamp.light();
}
return nextLamp;
}
}
LampController:灯控制器
package cn.itcast.Mr_Zhang.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();
//每10秒关闭当前灯,开启下一个灯
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
// closeLight方法返回的Lamp赋值给currentLight
currentLamp = currentLamp.closeLight();
}
},
15,
15,
TimeUnit.SECONDS);
}
}
Road:路
/*
* 路的功能:
* 随即增加车辆,定时减少车辆,把车辆看成是路中的数据,从而把车辆存储到集合中
* 因为在增加和删除过程中,需要有延时的效果,所以在构造函数中需要吧该执行代码放入到一个线程池中
* 让另一个线程执行,不然的话,这个对象一直创建不起来,创建的时候还在等待。
*/
package cn.itcast.Mr_Zhang.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 {
private List<String> vehicles = new ArrayList<String>();
private String name;
public Road(String name) {
this.name = name;
// 模拟在路上随机增加1000辆车,因为不可能等创建完1000辆车之后才检查灯的状态,所以这里需要创建单独的线程执行
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable() {
public void run() {
for (int i = 1; i < 1000; i++) {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 200);
} catch (InterruptedException e) {
e.printStackTrace();
}
vehicles.add(Road.this.name + '_' + i);
}
}
});
// 每隔1秒检查是否是绿灯,若是绿灯,则汽车通过,即减少一辆汽车
ScheduledExecutorService schedulePool = Executors
.newScheduledThreadPool(1);
schedulePool.scheduleAtFixedRate(new Runnable() {
public void run() {
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if (lighted) {
System.out.println(vehicles.remove(0) + " is through");
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}
RunTraffic:启动模拟交通灯管理系统
package cn.itcast.Mr_Zhang.traffic;
public class RunTraffic {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] roads = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S",
"N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
// 生成12个方向的路线
for (int i = 0; i < roads.length; i++) {
new Road(roads[i]);
}
// 产生交通灯系统
new LampController();
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.youkuaiyun.com