黑马程序员——交通灯管理系统的学习与分析

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

交通灯管理系统的学习与分析

 

针对这个题目,最重要的是对题目进行分析,首先,我们应该从我们最熟悉的路口进行入手,并画一张示意图进行描述,示意图如下:

由上图可知,在一个十字路口,一共有12条线路可以同行。

同时,为了方便起见,做出以下设定:

1.      忽略黄灯(黄灯只是在绿灯变红灯的时候加入几秒钟,去除不影响该系统的整体实现效果)。

2.      因为车辆始终可以向右转弯,所以右转路线的交通灯始终为绿灯,这样统一划定,便于编程实现。

该系统所设定的对象:红绿灯、红绿灯控制器、汽车、路。

对车辆进行分析

汽车通过路口的条件:1.绿灯亮。2.前面没有车。

对路进行分析

路中存有车辆的集合,同时也应有增加和删除车辆的方法。

面向程序设计的重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。

 

因为有12种路线,所以应有12个实例对象,此处使用枚举,更加方便。

对灯进行分析

除去向右转弯的4个灯共有8个灯,在这8个灯中,相对的灯点亮情况相同,即灯又是成对出现,所以只需要分析4组就可以了。此处分析S2N,S2W,E2W,E2S四个方向上的灯。

灯必须保存3个信息:1.绿灯是否点亮。2. 相对灯的信息。3. 下一个灯的信息。

加入是右转方向的灯,则不需要这3个信息。

编码阶段

 

对 “路”的定义

判断灯的点亮情况,并且获取车辆和释放车辆。

package com.itheima.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 {
	private List<String> vechicles = new ArrayList<String>();
	
	private String name = null;
	public Road(String name){
		this.name = name;
		
		ExecutorService pool = Executors.newSingleThreadScheduledExecutor();
		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 );
				}
			}
		});
		
		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) + "is traversing!");
							}
						}
					}
				},
				1,
				1,
				TimeUnit.SECONDS);
		
	}
}


对“灯”的定义

使用枚举列出12条道路上灯的点亮情况,并设置方法,当一个方向上绿灯点亮,则对应的一侧绿灯也会点亮。当一个方向绿灯熄灭,则对应的一侧的绿灯也熄灭,同时控制下一组绿灯点亮。

package com.itheima.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 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, 下面总共应有6个方向上能看到汽车穿过!");
	}
	
	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;
	}
}

对控制器的定义

对路灯进行定时点亮和熄灭。

package com.itheima.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);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						currentLamp = currentLamp.blackOut();
					}
				}, 
				10,
				10,
				TimeUnit.SECONDS);
	}
}

主函数:

package com.itheima.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"
		};
		
		for(int i = 0; i < directions.length; i++){
			new Road(directions[i]);
		}
		
		new LampController();

	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值