---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
交通灯控制系统
在学习这个面试题目的时候,我们应该先自己想想思路,看看自己能想到哪种程度,然后跟着张老师的思路学习,这样才能不但弄懂这道题,更重要的是要学会解题思路和方法。在这个视频中,我学到了更多的知识点和解题方法,如面向对象的思想,遇到有些问题可以画图让思路清晰,enum就是一个类,只不过他多了一些常量罢了,在合理的情况下让问题高度统一化等。
面向对象设计一条重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。例如:人在黑板上画圆
(圆有半径和圆心),列车司机紧急刹车(列车司机只是调用了列车的一个刹车方法,合适自己刹的车),售货员统计收获小票的金额(小票有数据,他就有统计的方法,),你把门关上了(你只是调用了门的关方法)等。
Road类的编写:
每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。
在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形式的字符串进行表示)。
在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
Lamp类的编写:
因为Lamp是固定的所以,我们可以用enum定义灯,
每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,nextLampName是下一个将要亮的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。 每个路的向右转弯的路上的lamp一直连,没有oppositeLampName;
LampController:等控制器,
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
LampController构造方法中要设定第一个为绿的灯。
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
Thread.sleep (new Random().nextInt(6)+1);暂停0-5之间的任意数
List<String> vechicles=new ArrayList<String>();
Vechicles.add(“abc”);
System.out.println( Vechicles.remove(0));
main方法:
用for循环创建出代表12条路线的对象。
接着再获得LampController对象并调用其start方法。
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/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------