黑马程序员_交通灯管理系统思路整理

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

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

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

例如:

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

       由西向而来去往南向的车辆 ---- 右转车辆

       由东向而来去往南向的车辆 ---- 左转车辆

       ..............................

 

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

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

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

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

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

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

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

题目分析

❶由题中说行驶方向可以把方向分为12个方向,根据这12个方向可以简化问题
①由南向北(S2N)其对应方向为北向南(N2S)
②由东向西(E2W)其对应方向为西向东(W2E),
③由南向西(S2W)其对应方向为北向东(N2E),
④由西向北(W2N)其对应方向为东向南(E2S),
⑤还有四个右转弯的方向分别是由西向南(W2S),
由北向西(N2W),由东向北(E2N),由南向东(S2E)

❷由题干可以把该该题抽象成3个对象,分别是Road对象,Lamp对象,LampController对象

ROAD类代码
该类负责随机产生车辆和放行车辆,因为车是Road对象里面的数据,所以Road对象负责创建车和放行车
,放行车的时候第一检查该路口是否有车,第二该路口灯是否是绿灯,二者满足之后才放行
package com.enjoy.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
{
	public List<String> vehicle = new ArrayList<String>();//存放车的数组
	public String name = null;

	public Road(String name)
	{
		this.name = name;
		ExecutorService service = Executors.newFixedThreadPool(1);
		service.execute(new Runnable()
		{
			@Override
			public void run()
			{
				for (int i = 1; i < 500; i++)
				{
					try
					{
						// 间隔1-10秒来一辆车
						Thread.sleep(((new Random().nextInt(10)) + 1) * 1000);
					} catch (InterruptedException e)
					{
						e.printStackTrace();
					}
					vehicle.add(Road.this.name + "_" + i);
				}
			}
		});
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable()
		{
			@Override
			public void run()//每隔1秒钟放行一辆车
			{
				if (vehicle.size() > 0)
				{
					boolean bIsGreen=Lamp.valueOf(Road.this.name).isGreen();//如果该处的灯是绿灯
					if(bIsGreen)
					{
						System.out.println(vehicle.remove(0) + "刚刚驶过");
					}
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
	}

}

Lamp类

用于变换红绿灯和提供该灯的状态;a,b,c,d四组方向可以看成是一对应方向,
设置其中一个为绿灯的时候如果存在对应方向那么与之对应的方向也设置为绿灯,
由于题目告之右转弯方向不受交通信号控制所以那四个右转弯的方向一直保持绿灯,
灯变为红灯的时候第一要把自身灯变为红灯,如果存在相对应的灯就把相对应的灯
变为红灯,如果存在下一个灯那么就把下一个灯变成绿色的灯

package com.enjoy.traffic;

public enum Lamp
{
	//依次设置S2N的对应灯为N2S,E2W的对应灯为W2E,S2W的对应灯为N2E,W2N的对应灯为E2S	
	//依次设置S2N的下一个灯为E2W,E2W的下一灯为S2W,S2W的下一灯为W2N,W2N的下一灯为S2N	
	S2N("N2S","E2W",false),E2W("W2E","S2W",false),S2W("N2E","W2N",false),W2N("E2S","S2N",false),
	N2S(null,null,false),W2E(null,null,false),N2E(null,null,false),E2S(null,null,false),
	//这四个是右转弯方向灯一直处于绿灯状态(题干要求的)
	W2S(null,null,true),N2W(null,null,true),E2N(null,null,true),S2E(null,null,true);
	public boolean bIsGreen;//是否是绿灯true代表是绿灯,false代表红灯
	public String nextLampName;//下一个灯
	public String correspondingLampName;//相对应的灯
	Lamp(String correspondingLampName,String nextLampName,boolean bIsGreen)
	{
		this.correspondingLampName=correspondingLampName;
		this.nextLampName=nextLampName;
		this.bIsGreen=bIsGreen;
	}
	public boolean isGreen()
	{
		return this.bIsGreen;
	}
	public void green()//绿灯
	{
		this.bIsGreen=true;
		if(correspondingLampName!=null)//如果存在对应的方向灯的话,那么对应的灯也设置为绿灯
		{
			Lamp.valueOf(correspondingLampName).green();
		}
		System.out.println(name()+"灯已经变绿");
	}
	public Lamp red()//灯变红
	{
		this.bIsGreen=false;
		if(correspondingLampName!=null)//如果存在对应的灯那么也把对应的灯变红
		{
			Lamp.valueOf(correspondingLampName).red();
		}
		Lamp nextLamp=null;
		if(nextLampName!=null)//如果下一个方向的灯存在那么就把下一个方向的灯变绿
		{
			nextLamp=Lamp.valueOf(nextLampName);
			nextLamp.green();
			System.out.println(name()+"切换到---》"+nextLamp.name());
		}
		return nextLamp;
	}
	
}


LampController类

用于调度灯的状态:绿灯还是红灯 ,该类用于调度灯的状态,开始的情况下使由南向北的可以通行,
然后就是每隔10秒钟调度一次,让下一个灯变绿灯

package com.enjoy.traffic;

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

public class LampController
{
	private Lamp currentLamp;
	public LampController()
	{
		currentLamp = Lamp.S2N;
		currentLamp.green();
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable()
		{
			public void run()//路口灯每隔10秒变换一次
			{
				currentLamp=currentLamp.red();//这里每次调用红灯方法之后获得下一个灯的对象
			}
		},10,10, TimeUnit.SECONDS);
	}
}

MainClass测试类

public class MainClass
{
	public static void main(String[] args)
	{
		String[] directions =
		{ "S2N", "E2W", "S2W", "W2N", "N2S", "W2E", "N2E", "E2S", "W2S", "N2W", "E2N", "S2E" };
		for(int i=0;i<directions.length;i++)//创建12个方向的道路
		{
			new Road(directions[i]);
		}
		new LampController();//启动灯的调度器
		
	}
}

总结与归纳
面向对象设计:谁拥有数据,谁就对外提供操作这些数据的方法比方说人在黑板上画圆,
画圆的方法应该是圆内部的操作,圆内有x,y坐标和radius半径这些数据都是圆内部的数据,
所以说画圆的动作就应该封装在圆那个类里面。
在本例中灯具有红灯和绿灯所以拥有变换为红灯和绿灯的功能,还有就是向外提供灯的状态的功能
我觉得这个题还是很抽象如果能够独立做出来,如果能够独立想出来至少说面向对象的能力应该相当高了,而且在分析方向的时候容颜把头脑搞晕,

写在这里就当是整理一下思路



 

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


详情请查看:http://edu.csdn.net/heima












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值