看了张老师的交通灯面试题的讲解,收获颇丰。老张的确是牛人。在刚拿到题的时候,我自己想了想,发现没有一个清晰的思路。可是等他讲的时候,我发现很多地方比我想的确实要好。而且思路非常清晰。
那,看完了讲解,能不能按照自己的思路作呢?
我尝试了下,代码如下:
思路(和张老师有些不同):
1。对象的抽取:
舞台(整个的场景,用来做main的),车,路,交通灯,交通控制系统。
这部分基本一样。
但是,我不是把灯分成12个,而是把路分成12条。
我是这么想的,在实际中,灯有红绿,而一套交通控制系统,只要有两套红绿灯就够了。
而路和交通灯的关系,是通过在场景里设定的,而不是放到路里面,或者灯的本身里面。
这么做,好处是,如果增删路的条数,不会动很大的东西。
关于灯,张老师在做的时候,考虑的是红,绿两种状态,可是,需求里说,“同方向等待车辆,应先放行直行车辆,而后放行左转车辆”,并且考虑到日常生活,如果只有一条车道,直行车和左转的车,如果交叉进入一个车道,那么就不可能达到这个要求,所以,只能是按照2车道设计,即:仅左行车道,和直行车道。
于是,将绿灯分成了左行和直行两种。
2. 对象关系分析:
a) 车,路,灯 都在舞台上
b) 车在马上
c) 灯受控制系统的控制
d) 灯有两个颜色:红,绿
e) 十字路口,所以有2条路,受2组灯控制
f) 红灯后是绿灯
g) 绿灯先放真行,而后放左拐
h) 右行的车辆不受灯的控制
i) 绿灯的总时间和红灯的总时间是一致的,否则,会出现同时为绿灯,或者同时为红灯的情况。
在场景中,共有如下单独的线程:
1。随机增加车辆的线程
2。12条不同方向的路的线程,用来扫描,对比条件,然后去掉排队的车辆。
3。独立的交通控制系统。我灯的变化,和路,车毫无关系。但是,路上的车的情况,要根据我的灯的情况而变化。
3. 情景设计:
a) 右行车不受灯的控制,所以任何时候,只要有车都可以直接通过。
b) 设起始点是E2W方向为红灯
i. W2E,E2W方向,红灯
ii. 前20秒
1. N2S方向,直行绿灯
2. S2N方向,直行绿灯
iii. 后20秒
1. N2S方向,左转绿灯
2. S2N方向,左转绿灯
iv. 30秒后,S2N,N2S方向变为红灯
c) 进入第二个场景,S2N,N2S方向变为红灯
i. S2N,N2S方向变为红灯
ii. 前20秒:
1. W2E方向,直行绿灯
2. E2W方向,直行绿灯
iii. 后10秒
1. W2E方向,左转绿灯
2. E2W方向,左转绿灯
iv. 30秒后,回到初始场景(但是每条路的存留车辆不变)
所有的场景,都放到舞台里导演。
关于这一部分,我一直没有把握,感觉有些东西还能抽出来。
其实,我的想法很简单。大概的步骤可以概括如下:
1。有一个舞台:main
2。舞台加入道路
3。舞台加入控制系统
4。在路上加车
5。道路上车的数量,根据控制系统改变
但是这么搞,大量的逻辑都放到了5的里面搞的代码很难看。。。等培训完了,如果有好的思路,再修改吧。搞了一下午,头大了,不想搞了。。。。
下面就是所有的代码:
Vehicle.java
package com.linuxgg.interview.trafic;
public class Vehicle {
private Direction whereTogo;
private String name = null;
// 生成去来自哪里去往何方的车
public Vehicle(Direction whereTogo, String name) {
this.whereTogo =