黑马程序员--java小项目之交通管理系统(一)

2014-11-24 02:31:25 · 作者: · 浏览: 0

\

项目分析:


十字路的行车路线可以有十二个方向,分别为
直线行驶:
北-->南 N2S
南-->北 S2N
西-->东 W2E
东-->西 E2W
左拐弯:
北-->东 N2E
东-->南 E2S
南-->西 S2W
西-->北 E2N
右拐弯:
北-->西 N2W
西-->南 W2S
南-->东 S2E
东-->北 E2N


可以参考上面的图例



这样我么可以设计一个路线类,专门负责每条路线上的车辆放行,而车辆是否放行是由信号灯决定的,所以我们可以设计一个信号灯类,让每条路线上都有一个信号灯,
只是右拐弯的信号灯常亮为禄,允许一直通过。所以就有了十二个交通信号灯,并且所有的信号灯都知道自己的下一个灯是哪条路线上的,而有所的灯的亮和灭又由一
个灯控制系统进行控制,需要一个灯控制类。我们这里由于不需要实现对车辆的设计,所以没有设计车辆类,车辆用字符串代替。

注意:我们这里的信号灯只涉及一个绿灯

灯的亮灭顺序依次为:
N2S S2N
N2E S2W
E2W W2E
E2S W2N
S2N N2S
S2E N2W
W2E E2W
W2N E2S
一直亮的灯:N2W W2S S2E E2N

对象:
路线类-->Road
灯类--->Lamp
灯控制系统类--->LampControl

下面为类的源文件:

package cn.itcast.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;

/*
 * 路线类
 * 
 * 		启动另外一个线程去模拟车辆上路,启动一个定时器去实现车辆放行
 * 
 */
public class Road {
	// 路线方向
	private String name;
	// 路线上的所有车辆
	private List
  
    carList = new ArrayList
   
    (); public Road(String name) { this.name = name; car(); carPass(); } // 随机生成车辆,模拟车辆上路的过程 public void car() { ExecutorService pool = Executors.newSingleThreadExecutor(); pool.execute(new Runnable() { @Override public void run() { for (int x = 1; x <= 1000; x++) { try { Thread.sleep((new Random().nextInt(10) + 1) * 1000); carList.add(name + _ + x); } catch (InterruptedException e) { e.printStackTrace(); } } } }); } // 检查信号灯(绿灯)的亮和灭,实现车辆放行 public void carPass() { ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable() { @Override public void run() { // 判断路上是否有车 if (carList.size() > 0) { boolean lighted = Lamp.valueOf(name).isLight(); // 路上有车,判断灯是否为亮,如果是亮的,则放行一辆车 if (lighted) { String car = carList.remove(0); System.out.println(car + 通过); } } } }, 0, 1, TimeUnit.SECONDS); } } 
   
  

package cn.itcast.traffic;

/*
 * 信号灯类
 * 
 * 		此处只涉及到绿灯的亮和灭,由于灯数确定,我们可以设计成枚举类型
 */
public enum Lamp {
	/* 每个枚举元素各表示一个方向的控制灯 */
	S2N(N2S, S2W, false), S2W(N2E, E2W, false), E2W(W2E, E2S, false), E2S(
			W2N, S2N, 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, null, true);

	// 一个灯的与之对应的灯
	private String oppsite;
	// 一个灯的下一个灯
	private String next;
	// 灯的亮灭
	private boolean lighted;

	private Lamp(String opposite, String next, boolean lighted) {
		this.oppsite = opposite;
		this.next = next;
		this.lighted = lighted;
	}

	// 使一个灯变亮,那么它与之对应的灯也应该变亮
	public void open() {
		this.lighted = true;
		System.out.println(this.name() + 变亮);
		if (oppsite != null) {
			Lamp lamp = Lamp.valueOf(this.oppsite);
			lamp.open();
			System.out.println(lamp.name() + 变亮);
		}
	}

	// 一个灯变灭,那么它的对应的灯也要变灭,它下一个灯变亮
	public Lamp close() {
		this.lighted = false;
		if (oppsite != null)
			Lamp.valueOf(this.oppsite).close();

		Lamp nextLamp = null;
		if (next != null) {
			nextLamp = Lamp.valueOf(next);
			nextLamp.open();
		}
		return nextLamp;
	}

	public boolean isLight() {
		return lighted;
	}
}

package cn.itcast.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/*
 * 灯的控制器
 * 
 */
public class RoadController {
	// 最初亮的灯
	private String initLamp;
	// 当前亮的灯
	private Lamp currentLamp;

	public RoadController(String initLamp) {

		currentLamp = Lamp.valueOf(initLamp);
		currentLamp.open();

		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Run