黑马程序员_十字路口交通灯控制系统笔记

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

面向对象的思想:

在开始交通灯控制系统之前,先介绍面向对象的思想编程。

要点:谁有数据谁就提供对外操作这个数据的方法。

举例:

1. 人在黑板上画圆

对象:人、黑板、圆

画圆这个方法中必须有圆的圆心和半径,而圆心和半径是圆的属性,所以这个画圆的方法是圆这个对象的方法。


2. 列车司机刹车

对象:列车、司机

刹车这个方法是列车的方法。


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

对象:

石头Stone

石刀StoneKnife

树Tree

木材Material

椅子Chair

刀加工厂KnifeFactory

椅子加工厂ChairFactory

方法:

StoneKnife = KnifeFactory.createKnife(Stone, Stone)

Material = StoneKnife.cut(Tree)

Chair = ChairFactory.makeChair(Material)

交通灯问题

问题需求:


模拟十字路口的交通等管理系统逻辑,具体需求如下:
    1.异步随机生成按照各个路线行驶的车辆。
    例如:
           由南向而来去往北向的车辆 ---- 直行车辆
           由西向而来去往南向的车辆 ---- 右转车辆
           由东向而来去往南向的车辆 ---- 左转车辆
           ......
    2.信号灯忽略黄灯,只考虑红灯和绿灯。
    3.应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
    4.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
    注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
    5.每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
    6.随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

    7.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

分析设计

如下图,右转总是通行,其他的线路相同颜色的是一组,一组内的两条线路可以同时通行。
过程:东西路直行通行------>东西路左转通行------->南北路直行通行------->南北路左转通行------>东西路直行通行 (闭环)


面向对象的设计思路:
对象:交通灯、交通灯控制系统、路、车
这里没有涉及车的内部功能属性,所以车可以当成是路的一个属性。

1.设计路线

a. 用一个Road类来表示路线,一共有12条路线,所以就一共有12个Road类的实例对象
b. 每条路线上随机增加新的车辆,添加到一个集合中保存
c. 每条路线每隔一秒检查该路线对应的灯是否变绿,如果是,则将该集合中排在第一位的元素移除,即表示该路线上的第一辆车通过了路口。

2.设计交通灯

a. 用一个Lamp枚举来表示交通灯。一共有12个交通灯,右转的交通灯默认恒绿。其他8个交通灯分为4组,每组的两个交通灯变化相同。
b. 每一组灯中抽出一个,进行控制。同一组中的另一个与被控制的灯同步变化。
c. 被控制的灯有三个属性:它同组的灯(也就是它对面的灯)、自己的状态(绿还是红)、下一个要变绿的灯

3. 设计交通灯控制系统

a. 必须要有个属性记住当前绿灯
b. 一个定时器对灯的变化进行定时控制

源代码

我都加了注释:
Lamp.java
public enum Lamp {
	//12个路灯,第一行是四个组中被控制的灯,第二行是四组中对应的另一个灯,第三行是右转灯
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("S2N","W2N",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 boolean lighted;
	//当前灯同组对应的灯
	private String opposite;
	//当前灯绿的下一个变绿的灯
	private String next;
	//构造方法
	Lamp(String opposite, String next, boolean lighted){
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	};
	//灯状态
	public boolean isLighted(){
		return lighted;
	}
	//灯变绿
	public void light(){
		this.lighted = true;
		//对应同组灯变绿
		if(opposite != null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(this.name() + " is changed to green");
	}
	//灯变红
	public Lamp blackout(){
		this.lighted = false;
		//对应同组灯变红
		if(opposite != null){
			Lamp.valueOf(opposite).blackout();
		}
		//下一个灯变绿
		Lamp nextLamp = null;
		if(next != null){
			nextLamp = Lamp.valueOf(next);
			nextLamp.light();
		}
		return nextLamp;
	}
}

Road.java
public class Road {
	//汽车集合
	private List<String> vehicles = new ArrayList<String>();
	//路的名字
	private String name = null;
	//构造方法,给定路的名字和指定路上的车
	public Road(String name){
		this.name = name;
		//下面这个线程用于产生车
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){
			@Override
			public void run() {
				for(int i=0; i<1000; i++){
					//随机间隔1-10s产生一辆车
					try {
						Thread.sleep(1000* (new Random().nextInt(10) + 1));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					vehicles.add(Road.this.name + " : " + i);
				}
				
			}
		});
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){

					@Override
					public void run() {
						//得到该路线上的灯状态
						boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
						//如果灯是绿的,而且这条路上有车,那就一秒通过一辆
						if(lighted){
							if(vehicles.size() > 1){
								System.out.println(vehicles.remove(0)+" is going through~");
							}
						}
					}
				}, 
				1, 
				1, 
				TimeUnit.SECONDS);
	}
}

LampControl.java
public class LampControl {
	//当前绿灯
	private Lamp current;
	//构造方法初始化
	LampControl(){
		current = Lamp.valueOf("S2N");
		current.light();
		//定时器变换灯
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					@Override
					public void run() {
						current = current.blackout();
					}
				},
				5,
				5,
				TimeUnit.SECONDS);
	}
}

主函数
		String[] directions = new String[]{
			"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"	
		};
		//创建路
		for(String direction : directions){
			new Road(direction);
		}
		//开始控制器
		new LampControl();

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值