---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
简单分析
1.要想模拟交通灯管理系统 起码得有车 有灯有路
2.我们可以这么做 生成车辆放在路上根据灯的状态 判断车是否还停留在这条路上
3.灯要怎么处理 其实就是给他一个初始状态 再弄个定时器 让灯不断变化就行
4.实体有两个路与灯
进一步分析
1.路类
------路类 要做两件事 就是生成汽车 有消除汽车 (其实就是汽车的增删) 其实就是路类中保存一个字符串数组 用于表示所有这条路上的汽车
-------路类中有个2个变量 一个是字符数组 一个是字符串 字符串是因为有12条路 你要怎么表示呢 用字符串表示到底是那条路
------路要做的是根据灯的状态 来执行车辆的增删
2.灯类(我们要做到的是灯不断的自动变换 要求是相对的灯的状态一样 相邻的灯状态不一样)
要想做到不断自动变换就要用到一个定时器 所以出现了灯的控制器 每10秒灯就变换一次
-----要想做到(生成车辆放在路上根据灯的状态 判断车是否还停留在这条路上)就要有判断灯是否是绿的这样的方法
-----有灯就有红绿 如果我变成了绿灯那么与我相对的也要变成绿灯 如果我变红灯 那么与我相对的也是红灯 但相邻的却是绿灯
-----所以灯类中有3个变量 灯的状态lighted 相对的灯opposite 下一个灯也就是相邻的灯next
-----还有 怎么表示下一个方向和相对方向呢 这时候就用的了枚举 只有12个实例 并给实例赋初值 S2N("N2S", "S2W", false) 参数表示相对的相邻的 是否绿灯
3.测试类主类
----要做的是1.生成12条路 (模拟一个十字路口)2.调用灯的控制器 让灯不断变换
-----这样就做到了12条路不断产生车辆 又根据的灯的状态不断的消除车辆(路类做的事)
-----灯是怎么不断变换的呢 付一个初始值比如s2n灯亮着 过10秒后调用灯灭的方法 而灯灭的方法返回的是此灯的下一个灯
过10再调用下一个灯的灯灭方法 这样就可以循环下去了
源代码
路类
public class Road {
//数组保存车辆 字符串表示路名
List<String> vechicies = 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 = 1; i < 1000; i++) {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
vechicies.add(Road.this.name + "_" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
//根据车的状态把车从数组中去掉
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (vechicies.size() > 0) {
boolean lighted =Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vechicies.remove(0)+" is traversing! ");
}
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}
灯枚举类
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() {
}
//灯的3变量 状态 相对灯与相邻的灯
private boolean lighted;
private String opposite;
private String next;
//判断灯状态
public boolean isLighted() {
return lighted;
}
//把灯变绿
public void light() {
this.lighted = true;
if (opposite != null){
Lamp lampOpposite = Lamp.valueOf(opposite);
lampOpposite.light();
}
System.out.println(name()+" 灯变绿了");
}
//把灯变红
public Lamp blackOut() {
this.lighted = false;
if (opposite != null) {
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp = null;
if (next != null) {
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name()+"--------->切换为"+next);
nextLamp.light();
}
return nextLamp;
}
}
灯的控制器
public class LampController {
//保存灯实例
private Lamp currentLamp;
//赋初值
public LampController() {
currentLamp = Lamp.S2N;
currentLamp.light();
//定时器 每10秒调用一次 由亮变成灭的方法
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("来啊");
currentLamp = currentLamp.blackOut();
}
}, 10, 10, TimeUnit.SECONDS);
}
}
测试类
public class MainClass {
public static void main(String[] args) {
//生成12条路
String[] directions = new String[]{
"S2N"," S2W", "E2W", "E2S",
"N2S" , "N2E", "W2E", "W2N",
"S2E", "E2N", "N2W", "W2S"
};
for(int i =0;i<directions.length;i++){
new Road(directions[i]);
}
//调用灯的控制器也就是灯开始变化了
new LampController();
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------