黑马程序员-10-交通灯管理系统笔记

------- 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.}  


 

 以上是学习了张孝祥老师的视频后的一点思考。张老师的视频所教给我们的不止是一个交通灯项目,而是解决同类问题的思路和编程的思想

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值