先画出图以便于分析问题:
项目分析:
用面向对象的方式思考:项目中出现的对象分别有:路灯、路灯控制器、路。因为项目的侧重点是路灯,所以就把路上行驶的车看做是路的一个属性,并且路会根据路灯确定是否让车子前进,路还有向自己增加车子的方法。
具体要写代码的思路:
1、路灯
首先“路灯”因该是一个枚举类型,因为此项目中有12条不同的路,每条路上都要有一个路灯,所以路灯的实例因该只有12个。用面向对象的方式思考:谁拥有数据谁就应该提供操作这些数据的方法,则路灯因该有控制自己变红和变绿的方法,而且还要有向外部提供自己现在是红灯还是绿灯的方法。
2、路灯控制器
顾名思义,路灯控制器就因该控制路灯的变化,当new出一个路灯控制器的实例时它就因该不停的工作,所以它因该创建一个新线程,又因为路灯的变化是一个有规律的死循环,则考虑到用一个有频率的定时器来实现这个功能。
3、路
分析可知一共有12条不同的路线,所以路对象因该只创建12个不同的实例。路还因该有一个集合类,用来保存路上的车。路还因该有一个方法用来管理路上的车能否通过十字路口,路还因该有一个向自己添加车辆的方法。而且这两个方法都因该是一个单独的线程在运行,并且是在路创建的时候就开始运行了,所以在路的构造方法中因该创建了两个线程来执行这两个不同的方法。
下面是这个项目的代码实现:
1、路灯的代码:
- package com.hbsi.interview.traffic;
- public enum Lamp {
- //因为路灯间是有逻辑关系的,所以只控制这四个灯,其他的灯就都能够确定是什么状态了
- S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",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,