黑马程序员__交通灯管理系统

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

交通灯管理系统

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

 异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。

 信号灯忽略黄灯,只考虑红灯和绿灯。

 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

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

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

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

问题分析:

首先,十字路口方向有东南西北四个方向。
各个方向车辆可能行走的路线。
E:东
1.E2W
2.E2S
3.E2N
S:南
1.S2N
2.S2W
3.S2E
W:西
1.W2E
2.W2N
3.W2N
N:北
1.N2S
2.N2W
2.N2E
如图:

黑马程序员__交通灯管理系统


所以可以看出车辆路线总共有12种。
而四个方向是两两对应的,也就是说东和西的车辆行走路线是对应的,南和北车辆行走路线是对应的。
所以在逻辑设计的时候只设计两个方向的逻辑另外两个方向与其对应受他们的改变而发生改变。
右转弯不受灯限制也就是一直为绿灯,所以剩下要设计逻辑的是四条路线。

选择南和东两个方向来设计逻辑,假如首先是南向北的灯是绿灯
1.南向北变为红灯时,南向西的灯变为绿灯。
2.南向西的灯变为红灯,东向西的灯变为绿灯。
3.东向西的灯变为红灯时,南向北的灯变为绿灯,重新回到第一条循环执行。

下面来考虑用到的类
1.车辆行走路线 Road
2.交通灯 Lamp
3.交通灯控制器 LampController
4.测试类MainClass


代码实现:
Road类
package cn.itcast.interview.trafficlamp;
import java.util.*;
import java.util.concurrent.*;
/**
交通灯管理系统的Road类
类中实现了生成车辆和减少车辆的方法
*/
public class Road
{
	//定义一个集合存放生成的车辆
	private ArrayList<String> vehicles = new ArrayList<String>();
	
	//初始化车的名字
	private String name;

	//构造函数初始化一个车
	Road(String name)
	{
		this.name = name;
		/*创建一个线程生成车辆
		  这里必须创建线程生成车辆,否则会导致Road类创建对象时“难产”
		*/
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable()
		{
			public void run()
			{
				for(int i=0;i<100;i++)
				{
					try
					{
						Thread.sleep((new Random().nextInt(10)+1)*1000);

					}
					catch (Exception e)
					{
						throw new RuntimeException("线程异常");
					}
					vehicles.add(Road.this.name+"_"+i);
				//	System.out.println(Road.this.name+"is running");
				}
			}
		});
		//创建一个定时器,每过一秒减少一辆车,也就是通过了交通灯
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
			new Runnable()
			{
				public void run()
				{
					if(vehicles.size()>0)
					{
						boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
						if(lighted)
							System.out.println(vehicles.remove(0)+" is traversing");

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



交通灯Lamp枚举类
package cn.itcast.interview.trafficlamp;
/*
创建一个Lamp灯枚举类
进行各种情况的逻辑判断
*/
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),N2W(null,null,true),E2N(null,null,true),W2S(null,null,true);
	private String opposite;
	private String next;
	private boolean lighted;
	/*
	构造函数对枚举元素进行初始化
	*/
	private Lamp()
	{
	}
	private Lamp(String opposite,String next,boolean lighted)
	{
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	/*
	是否为绿灯
	*/
	public boolean isLighted()
	{
		return lighted;
	}
	/*
	将灯设为绿灯
	*/
	public void light()
	{
		lighted=true;
		if(opposite!=null)
			Lamp.valueOf(opposite).light();
		System.out.println(name()+" --->变为绿灯,下面总共应该有六个方向能看到车穿过");

	}
	/*
	将灯设为红灯
	*/
	public Lamp blackOut()
	{
		System.out.println(name()+" --->变为红灯");
		lighted=false;
		if(opposite!=null)
		{
			Lamp.valueOf(opposite).blackOut();
		}
		Lamp nextLamp = null;
		if(next!=null)
		{
			nextLamp = Lamp.valueOf(next);
			nextLamp.light();
			System.out.println("绿灯从 "+name()+" 切换为--->"+next);
		}
		return nextLamp;
	}
	

}



交通灯控制器类LampController
package cn.itcast.interview.trafficlamp;
import java.util.concurrent.*;
/*
交通灯控制器类
*/
public class LampController
{
	//当前灯
	private Lamp currentLamp;
	//构造函数初始化接收一个灯对象
	LampController(Lamp currentLamp)
	{
		this.currentLamp=currentLamp;
		//将传入的灯变为绿灯
		currentLamp.light();
		//创建线程调度池,每10秒变换一次灯的颜色
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable ()
		{
			public void run()
			{
				LampController.this.currentLamp = LampController.this.currentLamp.blackOut();
			}
		},
		10,
		10,
		TimeUnit.SECONDS
		);
	}
}



测试类MainClass:
package cn.itcast.interview.trafficlamp;
public class MainClass
{
	public static void main(String[] args)
	{
		//将12个方向的灯存入数组
		String[] vehicles = 
		{
			"S2N","S2W","E2W","E2S",
			"N2S","N2E","W2E","W2N",
			"S2E","N2W","E2N","W2S"
		};
		//创建各个方向的Road对象
		for(String vehicle : vehicles)
		{
			new Road(vehicle);
		}
		//生成交通灯控制器对象开始模拟交通灯管理
		new LampController(Lamp.S2N);

	}
}

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

你可能感兴趣的:(java)