黑马程序员_交通灯面试题

------- android培训java培训、期待与您交流! ----------

分析与设计:

面向对象设计的重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。

面向对象的本质就是将万物封装成对象,将对象特有的属性与方法封装在对象内部。

灯对象:只有可能会出现12个灯,所以就想到了枚举将12个灯枚举出来,但是由于右转车辆全是绿灯,所以只考虑8盏灯。由于向对面的灯控制是相同的(即对面直行或左转是同时发生的),所以只要考虑4盏灯的情况。

自己灯身上需要记住对面方向的灯以及自己隔壁的灯,因为自己亮的时候需要同时点亮对面的灯,自己暗的时候需要点亮隔壁的灯。

路对象:因为车是在路上行驶的,同时,自己所在路线对应的绿灯亮了还需要关注前面路上是否有车才能选择通行,所以,路中应该存有车辆集合,显然路上就应该有增加车辆和减少车辆的方法了。

车对象:因为车并不需要进行完整的运行过程,所以可以直接用String字符串表示。

路灯控制器:路灯控制器需要知道当前正在亮的灯,并且能够在一段时间后控制该等灭并且点亮隔壁的灯。

其中的关键步骤就是currentLamp = currentLamp.black(); 在lamp的black方法的后面能够返回此等灭后的下一盏灯。


代码部分:

路对象

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)*1000);
} catch (Exception e) {
e.printStackTrace();
}
vechicles.add(Road.this.name+"_"+i);//在道路上添加车辆
}

}
});

通过建立多线程,让多线程中间有sleep方法停顿,不停的往不同路线的道路上添加车辆——在ArrayList数组中不停的添加元素。

ScheduledExecutorService timer = Executors.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 travelling");//所有条件满足,让车子通过。
}
}
}
},
1,
1,
TimeUnit.SECONDS);

}

每一秒中都在检查该路段中的灯是否是绿灯,是否有车,并且让车通过。

灯对象:灯的对象都定义成枚举(枚举不是1.5的新特性)

public void light(){
this.lighted = true;//点亮自己的灯
if(opposite != null){
Lamp.valueOf(opposite).light();//同时点亮对面的灯
}
System.out.println(name()+"lamp变绿了,下面总共有6个方向能看到汽车穿过马路");
}

public Lamp black(){
this.lighted = false;
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).black();//在自己灯关闭的时候同时关闭对面的灯。
}
Lamp nextLamp = null;
if(next != null){
nextLamp = Lamp.valueOf(next);
nextLamp.light();//在自己灯关闭的时候同时点亮隔壁的灯。
}
System.out.println("绿灯从"+name()+"----------->切换为"+ next );
return nextLamp;
}

灯的控制器对象:

public <SheduledExecutorService> LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
currentLamp = currentLamp.black();//关键步骤,就是在此处将正在亮的灯进行的不停的转换,与前面灯对象的black()方法相互呼应、
}
},
10,
10, 
TimeUnit.SECONDS);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值