关闭

黑马程序员Java应用之交通灯(TrafficLamp)

1282人阅读 评论(0) 收藏 举报

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

1、面向对象的分析

系统中的对象有灯,灯的控制系统,汽车,线路;这里不需体现车的移动,只需捕捉减少车辆的过程。

下面逐一实现

a灯(lamp)可用枚举实现

package horse;
/**这是一个枚举灯,四个路口每个路口三个所以共有12个灯
 * 右行不受控制灯四个方向S2E,E2N,N2W,W2S
 */
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 linghted) {
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	//当前灯是否为绿
	private boolean lighted;
	//与当前灯同时为绿的对应方向
	private String opposite;
	//当前灯变红时下一个变绿的灯
	private String next;
	//判断灯的颜色是否为绿
	public boolean isLighted(){
		return lighted;
	}
	//某个灯变绿时,它对应方向的灯也要变绿
	public void light(){
		this.lighted = true;
		if(opposite != null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(name()+"lamp is green,下面共有六个方向可以看到汽车穿过");
	}
	//变红时,它对应方向的灯也要变红,并返回下个要变绿的灯
	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;
	}
}

b下一部分是灯控制器(LampController

整个系统之呢过有一套交通灯控制系统,如果多个后果不堪设想(车祸)所以LampController最好设计成单例。构造方法中设第一个为绿,使对象start方法中当前灯变绿后启动定时器,每隔10s当前灯变红和将下一个灯变绿

 

package horse;
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.E2N;
		currentLamp.light();
		//每隔10s将当前绿灯变红,并让下一个方向的灯变绿,timer是个定时器
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable(){
			//这里创建了一个线程作为第一个参数
			public void run(){
				System.out.println("来了");
				currentLamp = currentLamp.blackOut();
				}
			}, 10, 10, TimeUnit.SECONDS);
	}
}


Java6.0版本中新增了concurrent包,这个包是用作线程同步的包,提供了很多工具类。其中定时器就是其中之一。通过 ExecutorsnewScheduledThreadPool(1)返回一个 ScheduledExecutorService,调用它的scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 方法创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay后开始执行,然后在 initialDelay+period后执行,接着在 initialDelay + 2 * period后执行,依此类推。这里设置initialDelay10period10,单位为s

c路(Load

每个方向代表一个路线,共12条路线;路上可随机增加新的车辆到集合中保存;每天线路每隔1s都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的一辆移除(即车穿过了路口)

package horse;
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> vechicles = new ArrayList<String>();
	private String name = null;
	public Road(String name) {
		super();
		this.name = name;
		//模拟车辆不断随机上路的过程
		ExecutorService pool = Executors.newSingleThreadExecutor();
		//这个pool的对象只有一个参数,只是这个参数是个函数
		pool.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();
					}
					vechicles.add(Road.this.name+"_"+i);
				}
			}
		});
		//每个1s检查对应的灯是否为绿,是则放行一辆车
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable(){
			public void run(){
				if(vechicles.size()>0){
					boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
					if(lighted){
						System.out.println(vechicles.remove(0)+"正在放行");
					}
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
	}
}

d模拟测试

package horse;
/**这是一个模拟测试的类
 * @param args
 */
public class TestTraffic {

	public static void main(String[] args) {
		//产生12方向的路线
		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();
	}

}

每隔10秒灯的颜色改变一次,且每次都能看见6个方向上有车辆穿过

感受:在写这个应用的时候我按了很多快捷键(alt+/)按一个快捷键就出来你想到的东西了并且要导入的包也帮你导了很方便,这使我觉得写代码也是很有趣的

 ---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37215次
    • 积分:867
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:11篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论