交通灯管理系统

 

                             交通灯管理系统

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

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

例如:

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

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

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

       。。

  • 信号灯忽略黄灯,只考虑红灯和绿灯。
  •  应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
  •  具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

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

  •  每辆车通过路口时间为 1 秒(提示:可通过线程 Sleep 的方式模拟)。
  •  随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
  • 不要求实现 GUI ,只考虑系统逻辑实现,可通过 Log 方式展现程序运行结果。

系统分析

一、系统实现的模拟图,

 

二、根据系统的要求来提取对象

   1、Rode 路

   2、Lamp灯

   3、Vechicle 车辆

   4、LampController 控制灯的切换

三、各对象间的联系

  Lamp (灯):设计灯的状态只有两种,即绿为可以行走,灯有一个记录这个灯对面的灯(跟这个灯切换同步,变亮时把自己对应的灯也变亮),下一灯(用来进行灯的切换,这个灯红时,同时把下一个灯变绿)的属性。红为停。灯有操作自己变红变绿的方法,还有返回灯现在状态的方法。

   Rode(路):系统中总共应该只有12条路线,所以只能有12个实例Rode对象,在这个系统中只是模拟车辆的路过,所以可以不用设置车辆对象。Rode对象可以随机添加车辆,表示这条路线上来的车辆。并且每隔一秒钟来检查该路线上的灯是否为绿灯。如果是,则把第一辆车放行。

 LampController (灯的控制系统):定时来进行灯的切换控制

四、系统的代码实现

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

/**
 * 交通灯管理系统中的路对象,在这个对象中,有增加车辆和移除车辆的方法,有路的名字
 * @author 
 */
public class Rode {

	private String name;
    private  List<String> vehicles=new ArrayList<String>();//每条路上车辆的集合
    public Rode(String name)
    {
    	this.name=name;
    	//使用线程来模拟这条路线上随机增加车辆
    	ExecutorService executorService=Executors.newSingleThreadExecutor();
    	executorService.execute(new Runnable() {
			
			@Override
			public void run() {
				int i=1;
				while(true)
				{
					try {
						Thread.sleep(new Random().nextInt(10)*1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					vehicles.add(Rode.this.name+"的第"+i+"车辆");
					i++;
				}
			}
		});
        //每隔一秒钟进行检查这条路线上的灯是否为绿灯 ,如是则每次减一辆车
    	ScheduledExecutorService checkLamp=Executors.newScheduledThreadPool(1);
    	checkLamp.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				boolean islighted=Lamp.valueOf(Rode.this.name).islighted();//判断这条路上的灯是否为绿灯
				if(islighted&&vehicles.size()>0)
				{
				  System.out.println(vehicles.remove(0)+"is travling");
				}
				
			}
		},
		1,
		1,
		TimeUnit.SECONDS );
    }
	
}
 

package cn.iosoftstone.interview.traffic;

/**
 * 定义交通灯类,因一共为12个类对象,所以在这个系统中以枚举的方式来定义比较合适
 * @author 
 *
 */
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 next;//表示下一个灯
	private String opposite;//表示对面的灯
	private boolean lighted;//灯的状态
	private Lamp(String opposite,String next,boolean lighted)
	{
		this.next=next;
		this.opposite=opposite;
		this.lighted=lighted;
	}
	//提供一个使自己变红并把下一个灯变绿的方法,表示灯的切换
	public Lamp blackOut(){
		this.lighted = false;
		if(opposite != null){
			Lamp.valueOf(opposite).blackOut();
		}		
		Lamp nextLamp= null;
		if(next != null){
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从" + name() + "切换为" + next);			
			nextLamp.light();
		}
		return nextLamp;
	}
	//提供一个变自己变亮,同时也把对面的灯也变亮的方法
	public void light(){
		this.lighted = true;
		if(opposite!= null){
			Lamp.valueOf(opposite).light();
		}
	}
	public boolean islighted()
	{
		return this.lighted;
	}
	

}


 

 

package cn.iosoftstone.interview.traffic;

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

/**
 * 进行灯的切换的控制系统
 * @author 
 *
 */
public class LampController {
    private Lamp currentlamp=Lamp.S2N;//先给一个灯让它为绿灯
    public LampController()
    {
    	this.currentlamp.light();//将这个灯设为绿灯
    	//定义一个线程来进行灯的切换
    	ScheduledExecutorService cutLamp=Executors.newScheduledThreadPool(1);
    	cutLamp.scheduleWithFixedDelay(new Runnable() {
			
			@Override
			public void run() {
				currentlamp=currentlamp.blackOut();
			}
		},
		10,
		10,
		TimeUnit.SECONDS);
    }
	
}
package cn.iosoftstone.interview.traffic;

/**
 * 交通系统的总控制器
 * @author
 *
 */
public class TrafficManager {
    
	public static void main(String[] args) {
		//用来存放每条路线的名称
	  String [] allRode={"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
	  for (int i = 0; i < allRode.length; i++) {
		new Rode(allRode[i]);//产生12条路线
	  }
	  //启动交通灯的控制器
	  new LampController();

	}

}


 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值