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

                                       黑马程序员——交通管理系统                                                                                    

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

交通管理系统分析与思路:

1.面向对象设计一个重要经验,谁拥有数据,谁就对外提供操作这些数据的方法。

如:人在黑板上画圆,画圆的方法是圆提供的。列车司机紧急刹车,刹车动作方法,是列车提供的,人只是调用了这个方法而已。
2 . 交通管理系统是车看到对应的灯判断穿过马路的过程。采用名词提炼法:路,灯,控制灯变化的定时器,而车过马路,我们只是捕捉马路上减少一倆车的过程,所以车不需要描述成一个对象,用一个字符串表示即可。
3. 代码实现描述一个路类

</pre><div><pre name="code" class="java">package com.it7k;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//描述一个路
public class Road {
	//维护一个集合,用来存储路上的车俩。
	private List<String> vehicles = new ArrayList<String>();
	//描述车名
	private String name=null;
	//给路初始化
	public Road(String name){
		this.name=name;
		//由于初始化路时,不可能还等着添加完车辆才能创建,所以使用多线程。
		new Thread(){
			public void run(){
				//路一创建,就产生1000俩车。
				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.name+"_"+i+"\t");
				}
			}
		}.start();
		//控制车辆的方法
		PDvehicles();
	}
	//判断车俩是否行驶过马路线程。
	public synchronized void PDvehicles(){
		//创建一个线程池对象
		ScheduledExecutorService ss = Executors.newScheduledThreadPool(1);
		ss.scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						//如果集合中有车俩,则判断灯,为true移除车俩
						if(vehicles.size()>0){
							//获取当前灯的状态
							boolean lighted = Lamp.valueOf(name).getLightde();
							if(lighted){
								System.out.println(vehicles.remove(0)+"通过了马路");
							}
						}
					}
				},
				1, 
				1, 
				TimeUnit.SECONDS);//单位,表示每过一秒通过一倆车
	}
}
然后描述一个灯类:灯可以变绿和变红方法,变绿车子行驶,变红车子停下。
每个方向的灯对应该方向行驶来的车辆。

package com.it7k;
//描述一个灯类,对应各个路线上的车俩
public enum Lamp {
	//代表4条主线路的灯对象所行驶的车俩
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
	//对应4条主线程的灯对象所行驶的车辆
	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);
	/**
	 * 
	 * @param opposite 表示对应的灯
	 * @param next 表示下一个灯
	 * @param lighted 灯当前的状态
	 */
	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 getLightde(){
		return lighted;
	}
	//如果当前灯为绿,赋值为ture允许通过
	public void green(){
	    this.lighted=true;
	    //判断是否有对应的灯,如果有,则让对应的灯也变绿
		if(opposite!=null){
			Lamp.valueOf(opposite).green();
		}
		//name()方法返回当前枚举对象名字
		System.out.println(name()+"灯变绿了,"+"下面应该有6个放向能看到汽车穿过...");
	}
	//如果当前灯为红,赋值为false不允许通过
	public Lamp red(){
		this.lighted=false;
		//判断是否有对应的灯,如果有,则让对应的灯也变红
		if(opposite!=null){
			Lamp.valueOf(opposite).red();
		}
		Lamp nextLamp=null;
		if(next!=null){
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从"+name()+".....切换为.."+next);
			nextLamp.green();
		}
		//返回下一个灯的状态
		return nextLamp;
	}
}

描述一个控制器,控制灯切换的功能。

package com.it7k;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class KzLamp {
	private Lamp nowLamp;//当前的灯
	public KzLamp(){
		//让第一个线路的灯等于当前的灯
		this.nowLamp=Lamp.S2N;
		nowLamp.green();//变绿
		open();
	}
	//让当前的灯在定时器规定的时间变化,开启交通灯
	public synchronized void open(){
		ScheduledExecutorService ss = Executors.newScheduledThreadPool(1);
		ss.scheduleAtFixedRate(
				new Runnable(){
					public void run(){//当前线程执行的任务
						nowLamp=nowLamp.red();
					}
				},
				10,
				10, 
				TimeUnit.SECONDS);
	}
}
调用主程序,测试该功能...

package com.it7k;

public class MainClass {
	public static void main(String[] args) {
		String[] arr = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
		for(int i = 0;i<arr.length;i++){
			new Road(arr[i]);
		}
		new KzLamp();//启动灯控制器
	}

}

交通管理分析思路图:





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





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值