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

 
 
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
需求(略) 思路 1、需求简述  实现道路交通灯的控制,以便道路上的车辆能够有序行驶。 2、名词提炼找对象  道路、道路交通灯、交通灯的控制、车辆。 3、简析对象  道路:东西南北四条路,每条路上都有直行、右转、左转三种路线,所以总共有12条路线;        道路上有车,随机增加车辆数目,另路对应若为绿且该路上车则车没隔1s就离开该路。  交通灯:12条路线对应有12个灯,灯有红、绿两种状态并对应有变绿、变红方法,经过分析可知,   南路直行、右转、左转3个灯的状态与北路的直行、右转、左转3个灯的状态是完全一致的, 同样东路与西路上对应的灯也是一致的,而且所有右转灯都是绿的状态。  控制系统:通过交通灯对象的分析,交通灯控制系统可只选取南北、东西中各一条进行分析即可, 又因为灯状态是循环变化的且一条路上的直行灯优于左转,所以,可假设由南向北的灯先 变绿,就有了绿灯的循环为南向北-->南向西-->东向西-->东向南-->南向北...  车辆:该名次在此题中可将其作为路上的一个属性,道路中有个集合来装车对象。 4、类的创建(属性和行为)  道路: 属性,路名,如南向北;装车对象的集合,可用ArrayList实例;车对象可用String类表示。 行为,随机增加车辆,按条件让在路最前方的车辆通过,这两个行为都需要异步实现,要用到      多线程技术,而且有两个行为,若写在一个run方法里面会比较麻烦,从而选择JDK1.5新特性,  Executors类库API及线程池思想解决该问题。  交通灯: 该类实例对象固定,十二个灯,可考虑JDK1.5新特性枚举类来实现。 属性,灯的状态可用true代表绿false代表红、对应灯的灯名、该灯变红后下一个变绿的灯的灯名。 行为,判断等的状态、让灯变绿、让灯变红、返回下一个灯。 控制系统:    属性:当前灯用以表示当前为绿灯的灯。 行为:每隔十秒将当前绿灯变为红灯并将当前灯的下一个灯变为绿灯,依次循环,需用异步实现。 5、编写主函数创建类实例对象,运行测试程序。 <代码示例>
package cn.ithema.interview.traffic1;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.Random;
public class Road {
	//定义路名
	private String direction;
	//定义集合,存储字符串车对象
	private List<String> vehicles = new ArrayList<String>();
	//定义构造函数
	Road(String direction){
		this.direction = direction;
		//创建一个线程给路随机增加车辆
		Executors.newSingleThreadExecutor().execute(new Runnable(){
			public void run(){
				for(int i=1;i<1000;i++){
					try {
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					vehicles.add(Road.this.direction+" "+i);
				}
			}
		});
		
		//创建一个定时器,用以控制道路上的车辆通行
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run() {
						//先判断路上有无车辆,有车辆才有可能让其通过
						if(vehicles.size()>0){
							Boolean lighted = Lamp.valueOf(Road.this.direction).isLighted(); 
							if(lighted){  //判断当前等是否为绿
								System.out.println(vehicles.remove(0)+" 正在通行");
							}
						}
					}
				}, 
				1, 1, TimeUnit.SECONDS);
	}
}
package cn.ithema.interview.traffic1;
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 opposite;
	private String next;
	private boolean lighted;
	//构造函数,灯实例化,变明确了对应灯、下一个灯、灯状态
	private Lamp(String opposite, String next, boolean lighted) {
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	//判断灯状态的方法
	public boolean isLighted(){
		return lighted;
	}
	//让灯变绿的方法,且对应灯也变绿
	public void light(){
		lighted = true;
		if(opposite!=null)
			Lamp.valueOf(opposite).light();
		System.out.println("<"+name()+">为绿,此时一共有六个路线有车通过。");
	}
	//让灯变红的方法,对应灯也变红,且下一个灯需要变绿,为灯控制系统方便操作,次出让其返回下一个灯
	public Lamp lightOff(){
		lighted = false;
		if(opposite!=null)
			Lamp.valueOf(opposite).lightOff();
		Lamp nextLamp=null;
		if(next!=null){
			nextLamp=Lamp.valueOf(next);
			nextLamp.light();
			System.out.println("此时绿灯从<"+name()+"> 切换为 <"+next+">");
		}
		return nextLamp;
	}
}
package cn.ithema.interview.traffic1;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class LampController {
	//灯总有6个灯为绿,且四个右转灯为常绿,另两个是对应灯,所以每次只需控制一个灯
	private Lamp currentLamp;
	//定义构造函数,并给当前灯赋值
	public LampController() {
		currentLamp = Lamp.S2N;
		currentLamp.light();
		//创建定时器,让灯循环由绿转红
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run() {
						currentLamp = currentLamp.lightOff();
					}
				}, 
				//参数意思依次为首次执行的延迟时间,连续执行周期,单位
				10, 10, TimeUnit.SECONDS);
	}
}
package cn.ithema.interview.traffic1;
public class MainClass {
	public static void main(String[] args) {
		//定义一个存储路名的字符串数组,方便创建路线
		String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S",
				"N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
		for(int i=0;i<directions.length;i++){
			new Road(directions[i]);
		}
		//实例化交通灯控制系统
		new LampController();
	}
}




------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值