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

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

 

学习了张孝祥老师的银行业务调度系统视频教程后,对于面向对象思想有了一个很直观的感受。

对于这道面试题,如果在还没看过这个教程之前,绝对能把我弄的糊里糊涂,但是张老师做这道题的思想确实很好。

 

题:模拟出十字路口红绿灯控制车辆的运行

 

面对这道题首先应该认清楚总共有几条路线,每个方向都有开往其他路线的车,经过分析出来总共12条路线。

 


再总结出每一个方向都有向右行驶的路线,而向右行驶,并不会对其他路线造成影响,所以对于向右行驶的路线可以一直认为是绿灯,下面将不予考虑。

再思考:
比如 南向开往北向时,那么北向也是开往南向的,南向开往西向时,北向也会开往东向,两条路线是相对的,那样就可以将来去的两条路线看作是一对,只要控制好其中一条,另一条也会做出相同的动作。

 

根据上一步的理论,可以总结出:
 那么控制了南向的向北和向西的两条路线,然后使北向的灯也跟随南向的灯转换,那么等于说就完成了南北两向的路线了(向右车辆不考虑)

 既然南北可以这样做,东西向也就可以。张老师是控制了南向两个灯,和东向两个灯,其他灯跟随相对的灯转换,就完出了思路。

在接下来的教程中,张老师运用了面向对象的思路,问到:到了现在,你们想这个程序中应该有几个类?
   最后总结出 需要 :路 灯 控制器  

   车被当作了路的一部分,路管理车的运行。

以下是我看过教程后,自己做了一遍

1:首先创建路 :

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 List<String> car = new ArrayList<String>();
	
	private String name;

	public road(String name)
	{
		this.name = name;
		
		//模拟车辆不断上路的过程
		
		//一个执行者,可以创建一个线程池,由线程池来调用线程执行命令
		ExecutorService pool = Executors.newSingleThreadExecutor();
		
		//将一个任务交给线程池执行
		pool.execute(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i<1000; i++)
				{
					try {
						//让线程停止1~10秒时间来不定时断续执行
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					car.add(road.this.name+"  "+i);
				}
				
			}
		});
		
		//模拟车辆不断下路的过程
	ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
	timer.scheduleAtFixedRate(
			new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					if (car.size() > 0)
					{
						boolean b = lamp.valueOf(road.this.name).islu();
						if(b)
							System.out.println(car.remove(0)+"      开走了");
					}
				}
			},
			1,
			1, 
			TimeUnit.SECONDS);
		
		
	}
}

 

2.创建灯

/*
 * 		s2n,s2w,e2s,e2w,
		n2s,n2e,w2n,w2e,
		s2e,e2n,n2w,w2s;
 * */
public enum lamp {
	s2n("n2s","s2w",false),s2w("n2e","e2s",false),e2s("w2n","e2w",false),e2w("w2e","s2n",false),
	n2s(null,null,false),n2e(null,null,false),w2n(null,null,false),w2e(null,null,false),
	s2e(null,null,true),e2n(null,null,true),n2w(null,null,true),w2s(null,null,true);
	
	private boolean bl;
	private String nextLamp;
	private String opposite;
	
	private lamp(String opposite,String nextLamp,boolean bl)
	{
		this.opposite = opposite;
		this.nextLamp = nextLamp;
		this.bl = bl;
	}
	
	public boolean islu()
	{
		return bl;
	}
	
	public void lu()
	{
		this.bl = true;
		if(opposite != null)
			lamp.valueOf(opposite).lu();
		System.out.println(name()+"。。。变绿了。。。");
	}
	
	public String hong()
	{
		this.bl = false;
		if (opposite != null)
			lamp.valueOf(opposite).hong();
		if(nextLamp != null)
		{
			lamp.valueOf(nextLamp).lu();
			System.out.println("绿灯从"+name()+"切换为"+nextLamp);
		}
		return nextLamp;
	}
	
}


3.创建灯的控制器

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


public class controller {
	private lamp l = lamp.s2n;  
	
	public controller()
	{
		//刚开始让由南向北的灯变绿
		l.lu();
		
		//每隔10秒钟在四条路线中切换
	ScheduledExecutorService se = Executors.newScheduledThreadPool(1);
	se.scheduleAtFixedRate(
			new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
				l = lamp.valueOf(l.hong())	;
				}
			}, 
			10, 
			10, 
			TimeUnit.SECONDS
			);
		
	}
}


4.最后调用

public class MainClass {
	public static void main(String[] args)
	{
		String[] s = new String[]{"s2n","s2w","e2s","e2w",
				"n2s","n2e","w2n","w2e",
				"s2e","e2n","n2w","w2s"};
		
		for (int i = 0;i<s.length;i++)
		{
			new road(s[i]);
		}
		new controller();
	}
}


 

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

                                                              详情请点击:http://edu.csdn.net/


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值