您的位置:首页 > 职场人生

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

2012-08-13 10:47 288 查看
---------------------- android培训java培训、期待与您交流! ----------------------

 

需求分析:

每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。

设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。

每条路线上随机增加新的车辆,增加到一个集合中保存。

每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

对象分析:

1、路属性:路名。-->功能:添加车,车减少

2、路灯属性:灯的状态。-->功能:切换灯的状态

3、交通灯控制器:为了体现体现灯的之间的关系

其实再创建一个对象路的时候,必须保证这条路上必须时刻有增加车辆的可能,和减少车辆的可能

所以必须在创建对象的时候必须保证该对象的属性车辆数上有时刻增加,和减少的可能,也就是创建两条线程

每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。

每条路线上随机增加新的车辆,增加到一个集合中保存。

每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口

下面用匿名内部类实现这两个增加和减少车辆的功能:

1.Road.java

package com.zlc.traffic;

import java.util.ArrayList;

import java.util.Random;

public class Road {

 public String name;

 public ArrayList car=new ArrayList();

 Road(String name)

 {

 this.name=name;

 //匿名内部类来模拟线程来实现车辆的增加

 Thread addCar=new Thread()

 {

 public void run()

 {

 for(int i=0;i<1000;i++)

 {

 try {

 Thread.sleep(new Random().nextInt(10)*500);

 car.add("车辆"+i+"上路了");

 System.out.println("车辆"+i+"上路了");

 } catch (InterruptedException e) {

 e.printStackTrace();

 }

 }

 }

 };

 //匿名内部类来模拟线程来实现车辆的减少

 Thread removeCar=new Thread()

 {

 public void run()

 {

 for(int i=0;i<1000;i++)

 {

 try {

 Thread.sleep(500);

 boolean lighted=Lamp.valueOf(Road.this.name).isLighted();

 if(lighted&&Road.this.car.size()>0)

 {

 System.out.println(car.remove(0)+"出去了");

 }

 } catch (InterruptedException e) {

 e.printStackTrace();

 }

 }

 }

 };

 removeCar.start();

 addCar.start();

 }

 public static void main(String[] args)throws Exception

 {

 Road A=new Road("第一条路");

 }

}

问题分析:

每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。

需求分析:

1.设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。

2.总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。

3.除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。

4.无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。

5.设计一个LampController类,它定时让当前的绿灯变红。

路灯分析:

1.路灯的属性:灯颜色的状态、对面灯的名字、灯的名字

2.路灯的行为:改变路灯的颜色

分析路线:直走和左拐,共八条,和右拐不受路灯控制的路线四条,共十二条

所以相应的灯也应该十二条:将路灯定义为枚举

//定义直走和左转

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);

1.Lamp.java

package com.zlc.traffic;

publicenumLamp{

 //其中每个枚举元素各表示一个方向的控制灯 

 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);

 

 privateLamp(String opposite,Stringnext,boolean lighted){

 this.opposite= opposite;

 this.next=next;

 this.lighted= lighted;

 }

privateboolean lighted;//当前灯是否为绿

 privateString opposite;//与当前灯同时为绿的对应方向

 privateStringnext;//当前灯变红时下一个变绿的灯

 publicboolean isLighted(){

 return lighted;

 }

publicvoid light(){//某个灯变绿时,它对应方向的灯也要变绿

 this.lighted=true;

 if(opposite!=null){

 Lamp.valueOf(opposite).light();

 }

 System.out.println(name()+" lamp is green,总共应该有6个方向能看到汽车经过");

 

 }

 

 //某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿

 publicLamp 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;

 }

}

2.定义一个路灯控制器(LampController.java)
package com.zlc.traffic;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

//定义一个控制器,控制器是一个多线程持续改变红一个灯

publicclassLampController{

 privateLamp currentLamp;

 publicLampController(){

 

 //刚开始让由南向北的灯变绿 

 currentLamp =Lamp.S2N;

 currentLamp.light();

 

 //每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿 

 ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);

 timer.scheduleAtFixedRate(

 newRunnable(){

 public void run(){

 currentLamp = currentLamp.blackOut();

 }

 },10,10,TimeUnit.SECONDS);

 }

}

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

详细请查看:http://edu.csdn.net/heima 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息