---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
交通灯管理系统
1, 首先向张孝祥老师致敬
张孝祥老师语录:
i. 害羞是找不到工作的。
ii. 细节见真英雄
iii. 新技术是为解决问题而诞生的
iv. 人的精力是有限的,应该把精力留给自己最爱的事业上,或者最主要的事情上
v. 人的精力就那么一点,不能够留给别人
vi. 必须干好一件事哦,你毕竟没有无穷无尽的精力
vii. 大家在搞这些值的时候要小心一点,以后找错误付出的代价就是你现在仔细代价的十倍
viii. 谁在利益面前都会低头的,我深知这个道理
ix. 未来是美好的牛奶和面包都会有的
x. 现在在北京多高的工资人家都给的起,就看你敢不敢要,会不会要
xi. 环境影响一个人,你得相信这句话
xii. 好,就这样吧
2, 分析
总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
车子只看自己的灯,而不看自己的方向
3, 面向对象的分析和设计
a) 对象:①红绿灯()和控制系统()
②路(Road)
③汽车àString
b) 灯的设计(12个用枚举)
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,Stringnext,boolean lighted){
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
private boolean lighted;
private String opposite;
private String next;
public boolean isLighted(){
return lighted;
}
public void light(){
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + "lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}
public Lamp blackOut(){
this.lighted = false;
if(opposite !=null&&Lamp.valueOf(opposite).isLighted()){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp= null;
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() +"---->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
}
c) java5的线程库—解决路的设计(Road)
原理:把任务交给线程池,线程池再从它的里面挑一个线程来执行
方法:
①newFixedThreadPool(int nThreads) 创建一个线程池,并说明线程数量
②ExecutorService newSingleThreadExecutor()
③ScheduledExecutorService newScheduledThreadPool(int number)//定时器
例子:
//①此代码实现每1—1000秒产生一辆汽车
ExecutorService pool=Executor.newSingleThreadExecutor()
pool.execute(new Runnable(){
public void run()
{
Thread.sleep((newRandom().nextInt(10)+1)*1000);
vechiles.add(Road.this.name+”_”+i);//访问外部类的成员变量
}
});
//②定时器例子 如果灯亮着那么就删除一辆车
ScheduledExecutorService timer= newScheduledThreadPool(1);
timer. scheduleAtFixedRate{
new Runnable(){
public void run()
{
if(vechicles.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){ System.out.println(vechicles.remove(0) + " is traversing !"
}
},
1000,//第一次
1000,//周期
TimeUnit.Second;//时间单位
}
d) 灯的控制器
public classLampController {
private Lamp currentLamp;
public LampController(){
//刚开始让由南向北的灯变绿;
currentLamp = Lamp.S2N;
currentLamp.light();
ScheduledExecutorServicetimer=
Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println("来啊");
currentLamp =currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
e) main函数
public static void main(String[] args) {
/*产生12个方向的路线*/
String[] directions = new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(inti=0;i<directions.length;i++){
newRoad(directions[i]);
}
/*产生整个交通灯系统*/
newLampController();
}
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------