`

黑马程序员-交通灯管理系统的分析、设计、实现

 
阅读更多

 

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

业务和需求分析:

模拟实现实现十字路口的交通灯管理系统逻辑,具体需求如下:

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

2.信号灯忽略黄灯,只考虑红灯和绿灯

3.左转车辆受信号灯控制,右转车辆不受信号灯控制

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

    * 东西向和南北向的车辆交替放行

    * 同方向等待车辆应先放行直行车辆,再放行左转车辆

5.假设每辆车通过路口所用的时间为1秒

6.随机生成车辆的时间间隔和红绿灯交换的时间间隔自定,可以自定义设置

7.不识闲GUI,只考虑系统逻辑实现,通过Log方式展现程序运行结果


面向对象的分析与设计:

* 设计时要遵循一个原则,谁拥有数据,谁就提供操作这些数据的方法

1.每条路线上都会出现多辆车,路线上要随机增加新的车,在绿灯期间还要每秒钟减少一辆车。

   * 设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线

   * 每条路线上随机增加新的车辆,增加到一个集合中保存

   * 每条路线每隔一秒检查是否为绿灯,是的话则将代表本条路线的集合中的第一辆车溢出,即表示穿过了路口

2.每条路线每隔一秒检查是否为绿灯,当变为红灯时,将下一个方向的灯变绿

   * 设计一个Lamp类来表示交通灯,每个交通灯都只有两种状态,红或绿。每个交通灯都有变红和变绿的方法,并且能返回自己的红绿状态

   * 一共有12条路线,所以需要12个交通灯。右转弯的路线本来不受交通灯的控制,但是为了让程序采用统一的处理方式,故假设出有4个

    控制右转弯的交通灯,只是它们的状态一直为绿灯

   * 除了右转弯方向的其它8条路线的交通灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组灯中各取出一个灯,        按东西向和南北向将其分为两对,再使这两对灯轮流切换红绿灯状态即可,为了实现这样的效果,Lamp类中要有一个变量记录和自己

     相反方向的灯,还要有一个变量来记录下一个要切换状态的灯(和自己成直角线的路线的灯)

   * 无论在程序的哪个地方去获取某个方向的灯,每次获取到的都是同一个实例对象,所以Lamp用枚举来现在就很方便

   * 设计一个LampController类,它定时让当期的绿灯变红

 

图例:


代码实现:

1.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.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;

 

/**

 * 这个类用来表示路

 * 

 * @author mrng

 */

public class Road {

// 用于存放汽车的集合

private List<String> vechicles = new ArrayList<String>();

// 用来表示每条路的名称

private String name;

 

public Road(String name) {

this.name = name;

// 创建一个线程库

ExecutorService pool = Executors.newSingleThreadExecutor();

// 使用一个线程来产生汽车

pool.execute(new Runnable() {

public void run() {

for (int i = 1; i < 500; i++) {

try {

// 在1-5秒钟之内产生一两汽车

Thread.sleep((new Random().nextInt(10 + 5)) * 1000);

catch (InterruptedException e) {

e.printStackTrace();

}

// 将汽车添加到集合中

vechicles.add(Road.this.name + "_" + i);

}

}

});

 

/**

 * 定义一个定时器,每隔一秒钟检查灯的状态 

 * 参数解释: 

 * 1,要执行的任务 

 * 2,过多长时间执行 

 * 3,过多长时间再次执行

 * 4,时间模式(这里使用的是秒)

 */

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(new Runnable() {

public void run() {

// 如果是绿灯就放行

if (Lamp.valueOf(Road.this.name).isGreen()) {

// 如果集合里有汽车的话执行移除操作

if (!vechicles.isEmpty()) {

// 将集合里的第一辆车移除,表示通过了路口

System.out.println(vechicles.remove(0) + " is traversing");

}

}

}

}, 1, 1, TimeUnit.SECONDS);

}

 

public List<String> getVechicles() {

return vechicles;

}

 

public void setVechicles(List<String> vechicles) {

this.vechicles = vechicles;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

}

 

2.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.traffic;

 

/**

 * 这个类用来表示交通灯

 * 

 * @author mrng

 */

public enum Lamp {

/**

 * S2N(由南向北,直行),S2W(由南向西,左转),E2W(由东向西,直行),E2S(由东向南,左转),

 * N2S(由北向南,直行),N2E(由北向东,左转),W2E(由西向东,直行),W2N(由西向北,左转),

 * S2E(由南向东,右转),N2W(由北向西,右转),E2N(由东向北,右转),W2S(由西向南,右转);

 */

S2N("N2S""S2W"false), S2W("N2E""E2W"false), E2W("W2E""E2S"false), E2S("W2N""S2N"false),

N2S(nullnullfalse), N2E(nullnullfalse), W2E(nullnullfalse), W2N(nullnullfalse),

S2E(nullnulltrue), N2W(nullnulltrue), E2N(nullnulltrue), W2S(nullnulltrue);

// 与当前灯相反方向的灯

private String opposite;

// 当前灯变红时下一个要变绿的灯

private String next;

// 当前灯是否为绿灯

private boolean isGreen;

// 返回当前灯的状态

public boolean isGreen() {

return this.isGreen;

}

private Lamp() { }

private Lamp(String opposite, String next, boolean isGreen) {

this.opposite = opposite;

this.next = next;

this.isGreen = isGreen;

}

// 将当前灯变为绿灯

public void Changed2Green() {

this.isGreen = true;

// 如果当前的灯需要控制相反方向的灯和当前灯的状态一致

if (this.opposite != null) {

Lamp.valueOf(opposite).Changed2Green();

System.out.println("-----" + this.name() + "-------" + opposite + "-----");

}

}

// 将当前灯变为红灯

public Lamp Changed2Red() {

this.isGreen = false;

// 如果当前的灯需要控制相反方向的灯和当前灯的状态一致

if (this.opposite != null) {

Lamp.valueOf(opposite).Changed2Red();

}

// 当前灯变红后,将下一个灯变绿

Lamp nextLamp = null;

if (this.next != null) {

nextLamp = Lamp.valueOf(next);

nextLamp.Changed2Green();

}

// 将下一个要变绿的灯返回给LampController

return nextLamp;

}

}


 

3.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.traffic;

 

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

 

/**

 * 交通灯的控制器

 * 

 * @author mrng

 */

public class LampController {

// 当前状态为绿色的灯

private Lamp currentLamp = Lamp.S2N;

public LampController() {

//将当前灯变绿

currentLamp.Changed2Green();

 

// 每10秒钟切换一次灯的状态

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(new Runnable() {

public void run() {

// 将当前灯变红后,得到下一个变绿的灯

currentLamp = currentLamp.Changed2Red();

}

}, 5, 5, TimeUnit.SECONDS);

}

}


 

4.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.traffic;

 

/**

 * 主类

 * 

 * @author mrng

 */

public class MainClass {

public static void main(String[] args) {

String[] directions = { "S2N""S2W""E2W""E2S",//

"N2S""N2E""W2E""W2N",//

"S2E""N2W""E2N""W2S" };

// 创建12条路线

for (String direction : directions) {

new Road(direction);

}

 

// 开启LampController

new LampController();

}

}

------- android培训java培训、期待与您交流! ----------   
详细请查看:http://edu.csdn.net/heima/
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics