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

-------android培训java培训、期待与您交流!     ---------- 
自己设想的另一种设计思路,拿出来分享,欢迎指摘批评

1.设计思路

 * 路的通行状态,有四种:
 * 1.南北(北南)直行, 记为SA, 
 * 2.南西(北东)左转, 记为SB, 
 * 3.西东(东西)直行, 记为SC,
 * 4.西北(东南)左转, 记为SD,

 * 每种状态包含二个方向上的灯控通行线路:
 * SA: S2N, N2S 
 * SB: S2W, N2E
 * SC: W2E, E2W
 * SD: W2N, E2S

 * 右转线路不受灯控,设计为包含在每种状态中,有四个方向:
 * S2E, W2S, N2W, E2N

 2.代码实现
public enum TrafficState
{
	SA, SB, SC, SD;
	
	/*private TrafficState()
	{	
		
		SA.addRoad(road)
		
		String[] rightTurns = "S2E,W2S,N2W,E2N".split(",");
		for(int i=0; i<rightTurns.length; i++)
		{
			TrafficState.values()[i].addRoad(new Road(rightTurns[i]));
		}
	}*/

	private ArrayList<Road> roads = new ArrayList<Road>(6);//每种状态在2+4个方向上有通行线路
	
	/*public void init()
	{
		//初始化各個狀態常量
		
		//將右轉路線添加到所有狀態
	}*/
	public TrafficState nextState()
	{	
		return TrafficState.values()[(this.ordinal()+1)%4];//按索引取下一个状态值
	}
	
	public void addRoad(Road road)
	{
		roads.add(road);
	}
	
	public void stateChanged(TrafficState lastState)
	{	
		if(null != lastState)//非初始狀態
		{
			stop(lastState);
		}
		traffic();
	}

	private void stop(TrafficState lastState)
	{
		//先關閉上一個狀態的交通
		for(Road road : lastState.roads)
		{
			road.offTraffic();
		}
		try
		{
			Thread.sleep(1000); //休息一下,让上一状态的车过完
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("State:"+lastState.name()+"-->"+this.name());
	}

	/*
	 * 打開本狀態的交通
	 */
	private void traffic()
	{
		for(Road road : roads)
		{
			road.onTraffic();
		}
	}
}

public class Road
{	
	//private static ExecutorService service = Executors.newSingleThreadExecutor();
	private String name; //代表那个线路方向上的车
	private boolean isGreen = true; //是否是綠燈
	private LinkedList<String> vehicles = new LinkedList<String>(); //路上的车辆.链表对添加,删除高效
	
	public Road(String roadName)
	{	
		this.name = roadName; 
		
		//模拟路上的不断来的车辆
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable()
		{
			
			@Override
			public void run()
			{
				for(int i=0; i<1000; i++)
				{
					//时隔(0-1)随机秒数来1辆车
					try
					{
						Thread.sleep(new Random().nextInt(1000)+1);//休息的目的是让cpu为其它线路上也产生车
					} catch (InterruptedException e)
					{
						e.printStackTrace();
					}
					//将车名加到数组中。车名:路名_序号
					vehicles.add(Road.this.name + "_" + i);
				}
			}
		});
	}

	public void onTraffic()
	{	
		ExecutorService service = Executors.newSingleThreadExecutor();//优化:静态变量 缓冲池
		service.execute(new Runnable(){

			@Override
			public void run()
			{	
				isGreen = true;
				while(isGreen)
				{	
					try
					{
						Thread.sleep(1000);
					} 
					catch (InterruptedException e)
					{
						e.printStackTrace();
					}
					if(vehicles.size() > 0)
						System.out.println(vehicles.pollFirst() + " has passed!");;
				}
				
			}});
	}
	
	public void offTraffic()//优化:wait() on the state condition
	{
		isGreen = false;
	}
}

/*
 * 控制的灯的变化
 */
public class TrafficStateController
{	
	private TrafficState currentState;
	private TrafficState lastState;

	public TrafficStateController(TrafficState currentState)
	{
		this.currentState = currentState;
		this.lastState = null;
		System.out.println("initial state:"+this.currentState);
		this.currentState.stateChanged(lastState);
	}
	
	/**
	 * 启动交通灯系统
	 */
	public void start()
	{
		//每隔5秒改变下状态
		 ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
		 service.scheduleAtFixedRate(
				 new Runnable()
				 {
					@Override
					public void run()
					{	
						TrafficStateController.this.lastState = 
							TrafficStateController.this.currentState;
						TrafficStateController.this.currentState = 
							TrafficStateController.this.currentState.nextState();
						//通知状态改变
						TrafficStateController.this.currentState
							.stateChanged(TrafficStateController.this.lastState);
						
						
					}
				 },   
				 5, 
				 5, 
				 TimeUnit.SECONDS);
	}//end start
	
}//end class

public class MainClass
{

	/**
	 * 設置交通燈系統,并啟動
	 * @param args
	 */
	public static void main(String[] args)
	{
		// 初始化方向線路
		String[] roadNames =
		{
			"S2N", "N2S", "S2W", "N2E",
			"W2E", "E2W", "W2N", "E2S",
		    "S2E", "W2S", "N2W", "E2N"
		};
		Road[] roads = new Road[roadNames.length];
		Road road = null;
		for(int i=0; i<roadNames.length; i++)
		{
			road = new Road(roadNames[i]);
			roads[i] = road;
		}
		//添加線路到相應的狀態,相當于粉絲找達人,
		TrafficState.SA.addRoad(roads[0]);
		TrafficState.SA.addRoad(roads[1]);
		
		TrafficState.SB.addRoad(roads[2]);
		TrafficState.SB.addRoad(roads[3]);
		
		TrafficState.SC.addRoad(roads[4]);
		TrafficState.SC.addRoad(roads[5]);
		
		TrafficState.SD.addRoad(roads[6]);
		TrafficState.SD.addRoad(roads[7]);
		//右轉是所有狀態的忠實粉絲
		for(int i=8; i<12; i++)
		{
			TrafficState.SA.addRoad(roads[i]);
			TrafficState.SB.addRoad(roads[i]);
			TrafficState.SC.addRoad(roads[i]);
			TrafficState.SD.addRoad(roads[i]);
			
		}
		
		//啟動交通燈系統
		new TrafficStateController(TrafficState.SA).start();
		
	}

}
------- android培训 java培训 、期待与您交流!     ----------  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值