黑马程序员_交通灯管理系统学习笔记

------- android培训java培训、期待与您交流! ----------

        要做好交通灯管理系统这个项目,首要的是联系生活经验,在脑海里模拟系统需要实现的功能。其次,编程需要使用的是面向对象的java语言,因此,要理清项目中出现的所有对象及其之间的关系,在这一过程中要对创建对象的每个类进行分析,重点和难点在于,确定每个功能(方法)属于哪个类。

        下面是我在学习张老师讲授对交通灯管理系统的分析时的笔记。

        一、系统需要实现的功能(逻辑步骤):

        1、  异步随机生成按照各个路线行驶的车辆。

        例如:

    由南向而来去往北向的车辆---- 直行车辆

    由西向而来去往南向的车辆---- 右转车辆(不受交通系统的影响)

    由东向而来去往南向的车辆---- 左转车辆(与对面直行过来的车辆路线形成交叉,因避免同时发生)

       。。。

 

        2、信号灯(忽略黄灯),只考虑红灯和绿灯。(黄灯的功能只是时间上的延迟,容易实现,且存在与否对项目没有本质影响)

 

具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

 

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

 

其他说明:

1、 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

 

2、  随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

 

3、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

 

看完要求就需要开始分析。

 

首先画图分析总共有多少条路线,看图:


 

 

总共有12条路线

 

      为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的灯可以假设称为常绿状态(通过这种方式,将不受交通灯系统影响的路线也纳入系统),另外,其他的8条线路是两两成对的,为4组,所以,程序只需要考虑途中标注了数字号的4条路线的控制灯的切换顺序,这四条路线相反方向的路线的控制灯跟随这4条路线切换,不必另外考虑。

 

然后进行面向对象的分析与设计。

 需要哪些对象呢?


首先想到,12条路都有名字,路上有车。所以应有Road类,类中有name和vechicles属性。车随时上路,用缓冲池模拟车上路(车与路的关系),然后每秒检查等是否绿,绿了就放一辆车,用缓冲池的调度。

注意:在这个项目中,车的属性和功能非常单一,甚至车的行驶方向都不需要考虑(因为这一属性由路来说明),因此完全可以抽象成一个”基本数据“。

 

其次是信号灯,12条线路12个灯,右转弯可以设置为常亮的不用考虑。其它8个两两相对可以设为四组。灯的设计用枚举来实现,每一个枚举元素都包含相对方向的灯opposite,下一个亮的next和灯是否为绿lighted等三个属性。light()方法,某个灯变绿时,相对的灯也要变绿,blackout()方法,某个灯变红时,相应的灯也变红,同时下一个灯变绿。

然后再构建一个灯的控制类。其中有一个当前等currentLamp属性和一个灯控制方法lampController().

 

    上面几个类做好了再写主函数。主函数内部创建12条路,启动灯控制。项目分析就完成了。

    以Road类为例,分析下代码:

package com.isoftstone.interview.traffic;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


/**
 * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
 * 每条路线上随机增加新的车辆,增加到一个集合中保存。
 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
 */
public class Road {
private List<String> vechicles = new ArrayList<String>();

private String name =null;
public Road(String name){
this.name = name;

//模拟车辆不断随机上路的过程
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name + "_" + i);
} 
}

});

//每隔一秒检查对应的灯是否为绿,是则放行一辆车
ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vechicles.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vechicles.remove(0) + " is traversing !");
}
}

}
},
1,
1,
TimeUnit.SECONDS);

}
}


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

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值