-------
android培训、
java培训、期待与您交流! ----------
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
......
2.信号灯忽略黄灯,只考虑红灯和绿灯。
3.应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5.每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6.随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
Road.java
LampControl.java
主函数
-------
Windows Phone 7手机开发、
.Net培训、期待与您交流! -------
面向对象的思想:
在开始交通灯控制系统之前,先介绍面向对象的思想编程。
要点:谁有数据谁就提供对外操作这个数据的方法。
举例:
1. 人在黑板上画圆
对象:人、黑板、圆
画圆这个方法中必须有圆的圆心和半径,而圆心和半径是圆的属性,所以这个画圆的方法是圆这个对象的方法。
2. 列车司机刹车
对象:列车、司机
刹车这个方法是列车的方法。
3. 两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子。
对象:
石头Stone
石刀StoneKnife
树Tree
木材Material
椅子Chair
刀加工厂KnifeFactory
椅子加工厂ChairFactory
方法:
StoneKnife = KnifeFactory.createKnife(Stone, Stone)
Material = StoneKnife.cut(Tree)
Chair = ChairFactory.makeChair(Material)
交通灯问题
问题需求:
模拟十字路口的交通等管理系统逻辑,具体需求如下:
1.异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
......
2.信号灯忽略黄灯,只考虑红灯和绿灯。
3.应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5.每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6.随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析设计
如下图,右转总是通行,其他的线路相同颜色的是一组,一组内的两条线路可以同时通行。
过程:东西路直行通行------>东西路左转通行------->南北路直行通行------->南北路左转通行------>东西路直行通行 (闭环)
面向对象的设计思路:
对象:交通灯、交通灯控制系统、路、车
这里没有涉及车的内部功能属性,所以车可以当成是路的一个属性。
1.设计路线
a. 用一个Road类来表示路线,一共有12条路线,所以就一共有12个Road类的实例对象
b. 每条路线上随机增加新的车辆,添加到一个集合中保存
c. 每条路线每隔一秒检查该路线对应的灯是否变绿,如果是,则将该集合中排在第一位的元素移除,即表示该路线上的第一辆车通过了路口。
2.设计交通灯
a. 用一个Lamp枚举来表示交通灯。一共有12个交通灯,右转的交通灯默认恒绿。其他8个交通灯分为4组,每组的两个交通灯变化相同。
b. 每一组灯中抽出一个,进行控制。同一组中的另一个与被控制的灯同步变化。
c. 被控制的灯有三个属性:它同组的灯(也就是它对面的灯)、自己的状态(绿还是红)、下一个要变绿的灯
3. 设计交通灯控制系统
a. 必须要有个属性记住当前绿灯
b. 一个定时器对灯的变化进行定时控制
源代码
我都加了注释:
Lamp.java
public enum Lamp {
//12个路灯,第一行是四个组中被控制的灯,第二行是四组中对应的另一个灯,第三行是右转灯
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("S2N","W2N",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;
//构造方法
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(this.name() + " is changed to green");
}
//灯变红
public Lamp blackout(){
this.lighted = false;
//对应同组灯变红
if(opposite != null){
Lamp.valueOf(opposite).blackout();
}
//下一个灯变绿
Lamp nextLamp = null;
if(next != null){
nextLamp = Lamp.valueOf(next);
nextLamp.light();
}
return nextLamp;
}
}
Road.java
public class Road {
//汽车集合
private List<String> vehicles = new ArrayList<String>();
//路的名字
private String name = null;
//构造方法,给定路的名字和指定路上的车
public Road(String name){
this.name = name;
//下面这个线程用于产生车
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
@Override
public void run() {
for(int i=0; i<1000; i++){
//随机间隔1-10s产生一辆车
try {
Thread.sleep(1000* (new Random().nextInt(10) + 1));
} catch (InterruptedException e) {
e.printStackTrace();
}
vehicles.add(Road.this.name + " : " + i);
}
}
});
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
//得到该路线上的灯状态
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
//如果灯是绿的,而且这条路上有车,那就一秒通过一辆
if(lighted){
if(vehicles.size() > 1){
System.out.println(vehicles.remove(0)+" is going through~");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
LampControl.java
public class LampControl {
//当前绿灯
private Lamp current;
//构造方法初始化
LampControl(){
current = Lamp.valueOf("S2N");
current.light();
//定时器变换灯
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
current = current.blackout();
}
},
5,
5,
TimeUnit.SECONDS);
}
}
主函数
String[] directions = new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
//创建路
for(String direction : directions){
new Road(direction);
}
//开始控制器
new LampControl();