`
jiao13953900900
  • 浏览: 32220 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多

 

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

 

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

 

 

 

交通灯管理系统

需求:

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

如:E2S.N2E等

2信号忽略黄灯。只考虑红绿灯。

3.应考虑左转车辆控制信号灯,右转车辆不收信号灯控制。

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

5每辆车通过路口的时间为1秒。

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

7不许实现GUI,只考虑逻辑实现。

 

思想:

我们初步设想一下有哪些对象:红绿灯,,红绿灯的控制系统,汽车,路线,汽车看到自己所在路线的绿灯亮了就穿越路口吗,不是,还需要看前面是否有车,看前面是否有车该问那个对象,,该问路,路中存储车辆的集合,显然路上应该有增加车辆和减少车辆的方法,根据题目,我们这里并不是体现车辆移动的过程,只是捕捉车辆穿越路口的过程,也就是捕捉路上车辆减少的过程,所以,这个车并不需要单独设计为一个对象,用一个字符串表示就可以

 

面向对象设计把握一个重要的经验,谁拥有数据,谁就对外提供操作这些数据的方法,在牢牢掌握几个典型的案例就可以了,例如:人在黑板上面画圆,汽车死机刹车等。售货员统计收获小票金额,你把门关上。

两块石头磨成一把石刀,石刀可以砍树,堪称木材,木材做成椅子。

球从一根绳子的一端移动到另一端。

每条路线上都会出现多辆车,路线上要随机增加新的车,在绿灯期间还要美妙煎熟一辆车。

设计一个Road来表示路,每个Road对象来表示一条路线共12条路线,及系统中总共产生12个Road的示例对象。

每条路线中随机增减新的 车辆,增加到一个集合中保存。

每条路线买个一秒都会检查控制本路线的灯是否为绿。是则兼本条路线保存车的集合总共的第一个车辆移除,记表示穿越了路口。

 

 

 定义一个类表示路

 

package com.isoftstone.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;

public class Road {
	List<String> vechicles=new ArrayList<String>();
	private String name=null;
	//在路上不断的产生汽车
	public Road(String name){
		this.name=name;
		//创建一个线程池,从线程池中选一条线程启动
		ExecutorService pool=Executors.newSingleThreadExecutor();
		//启动一条线程。execute的参数是一个Runnable接口
		pool.execute(new Runnable(){
			//实现Runnable接口i,并覆盖run方法
			public void run(){
				//自动生成1000辆车
				for(int i=1;i<1000;i++){
					try {//生成时间的间隔是随机的,使用Random类的nextInt方法,生成1-10的随机数,乘以1000,得到1-10s的随机时间
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (Exception e) {
						e.printStackTrace();
					}//把生成的汽车添加到路上。
					vechicles.add(Road.this.name+"—"+i);
				}
			}
		});
		//定义一个定时器,调度的意思,调度池大小1
		ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
		//定时器,根据固定频率进行做事
		timer.scheduleAtFixedRate(new Runnable(){
			public void run(){
				//检查路上有没有车,
				if(vechicles.size()>0){
					//定义一个变量代表灯,内部类用到外部类中的名字,用外部类名.this.name
					boolean lighted=Lamp.valueOf(Road.this.name).isLighted();//得到这个灯
					if(lighted){//如果前面的灯是亮点,那么就移除第一辆车。remove方法将返回取走的车
						System.out.println(vechicles.remove(0)+" is traversing!");
					}
				}
			}
		},
				1,//过多少秒做这件事
				1,//做完以后再过多少时间再做一次
				TimeUnit.SECONDS);//设置前面参数的度量单位。
		
		
		
		
		
		
		
		
		//定时器,参数Runnable对象
		/*timer.schedule(new Runnable(){
				
			},
			delay, //过多长时间以后做一件事
			unit);*/
		
		

	}
}

 

定义每一条路上面对应的灯

 

package com.isoftstone.interview.traffic;

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 Lamp(String opposite,String next,boolean lighted){
		this.opposite=opposite;
		this.next=next;
		this.lighted=lighted;
	}
	private Lamp(){}//添加一个不带参数的构造方法
	private boolean lighted;//定义一个变量,用于记住灯的状态
	private String next;//下一个灯
	private String opposite;//对面的灯
	//判断灯当前的状态
	public boolean isLighted(){
		return lighted;
	}//灯变亮的方法
	public void light(){
		this.lighted=true;
		if(opposite!=null){//如果有对应的灯,就让对应的灯亮,以免进入死循环
			Lamp.valueOf(opposite).light();//枚举的valueof方法,给他名字返回枚举对象,通过对象调用light();

		}
		System.out.println(name()+"lamp is green,下面总共应该有6个方向能看到汽车穿过!");
	}

	//灯变黑的方法
	public Lamp blackOut(){
		this.lighted=false;
		if(opposite!=null){//如果有对应的灯,就让对应的灯亮,以免进入死循环
			Lamp.valueOf(opposite).blackOut();//枚举的valueof方法,给他名字返回枚举对象,通过对象调用light();
		}
		Lamp nextLamp=null;
		if(next!=null){//灯灭以后如果有下一个灯,就让下一个灯变亮
			nextLamp=Lamp.valueOf(next);
			System.out.println("绿灯从"+name()+"------->转换为"+next);
			nextLamp.light();
			
		}
		return nextLamp;//返回新变绿的灯

	}
}

 

定义一个灯的控制器

 

package com.isoftstone.interview.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.light();//让对面的灯也亮
		//需要每过一段时间改变一个灯亮,使用定时器。
		ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
		//使用定时器的scheduleAtFixedRate方法。
		timer.scheduleAtFixedRate(new Runnable(){
			public void run(){//把当前灯改为新变绿的灯。
				currentLamp=currentLamp.blackOut();
			}
		},
		10, 10, TimeUnit.SECONDS);
	}
}

 

写一个主类,创建路的对象,和开启灯的控制器

 

package com.isoftstone.interview.traffic;

public class MainClass {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String[] directions=new String[]{
				 "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
		};
		//定义12条路,定义为不同的名字
		for(int i=0;i<directions.length;i++){
			new Road(directions[i]);
		}
		new LampController();//打开灯的控制器

	}

}

 

 

 

 

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics