------- android培训、java培训、期待与您交流! ----------
参考黑马同学的思路:
一.系统需要是实现的功能:
1.异步随机生成按照各个路线行驶的车辆;
例如:
由南向北的车辆-直行车辆;
由西向南--- 右转车辆(不受交通系统的影响);
由东向南---左转车辆(与对面直行过来的车辆路线形成交叉,因此避免同时发生)
2、信号灯(忽略黄灯),只考虑红灯和绿灯。(黄灯的功能只是时间上的延迟,容易实现,且存在与否对项目没有本质影响)
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
其他说明:
1、 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
2、 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
3、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
看完要求就需要开始分析。
为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的灯可以假设称为常绿状态(通过这种方式,将不受交通灯系统影响的路线也纳入系统),另外,其他的8条线路是两两成对的,为4组,所以,程序只需要考虑途中标注了数字号的4条路线的控制灯的切换顺序,这四条路线相反方向的路线的控制灯跟随这4条路线切换,不必另外考虑。
首先想到路,12条路都有名字,路上有车。所以应有Road类,类中有name和vechicles属性。车随时上路,用缓冲池模拟车上路(车与路的关系),然后每秒检查等是否绿,绿了就放一辆车,用缓冲池的调度。
注意:在这个项目中,车的属性和功能非常单一,甚至车的行驶方向都不需要考虑(因为这一属性由路来说明),因此完全可以抽象成一个”基本数据“。
其次是信号灯,12条线路12个灯,右转弯可以设置为常亮的不用考虑。其它8个两两相对可以设为四组。灯的设计用枚举来实现,每一个枚举元素都包含相对方向的灯opposite,下一个亮的next和灯是否为绿lighted等三个属性。light()方法,某个灯变绿时,相对的灯也要变绿,blackout()方法,某个灯变红时,相应的灯也变红,同时下一个灯变绿。
然后再构建一个灯的控制类。其中有一个当前等currentLamp属性和一个灯控制方法lampController().
以Road类为例,分析下代码:
01.package com.isoftstone.interview.traffic;
02.
03.
04.import java.util.ArrayList;
05.import java.util.List;
06.import java.util.Random;
07.import java.util.concurrent.ExecutorService;
08.import java.util.concurrent.Executors;
09.import java.util.concurrent.ScheduledExecutorService;
10.import java.util.concurrent.TimeUnit;
11.
12.
13./**
14. * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
15. * 每条路线上随机增加新的车辆,增加到一个集合中保存。
16. * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
17. */
18.public class Road {
19.private List<String> vechicles = new ArrayList<String>();
20.
21.private String name =null;
22.public Road(String name){
23.this.name = name;
24.
25.//模拟车辆不断随机上路的过程
26.ExecutorService pool = Executors.newSingleThreadExecutor();
27.pool.execute(new Runnable(){
28.public void run(){
29.for(int i=1;i<1000;i++){
30.try {
31.Thread.sleep((new Random().nextInt(10) + 1) * 1000);
32.} catch (InterruptedException e) {
33.e.printStackTrace();
34.}
35.vechicles.add(Road.this.name + "_" + i);
36.}
37.}
38.
39.});
40.
41.//每隔一秒检查对应的灯是否为绿,是则放行一辆车
42.ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
43.timer.scheduleAtFixedRate(
44.new Runnable(){
45.public void run(){
46.if(vechicles.size()>0){
47.boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
48.if(lighted){
49.System.out.println(vechicles.remove(0) + " is traversing !");
50.}
51.}
52.
53.}
54.},
55.1,
56.1,
57.TimeUnit.SECONDS);
58.
59.}
60.}
以上是学习了张孝祥老师的视频后的一点思考。张老师的视频所教给我们的不止是一个交通灯项目,而是解决同类问题的思路和编程的思想