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

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

2013-12-26 23:39 387 查看
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

面向对象分析:

1.设计一个Road类来代表线路,共有12条线路,需要实例化12个Road类对象。

Road属性:String name 用于表示线路名称。

List<String> vehicles 用于存放在该线路的车辆。

构造方法:1,通过构造方法设置线路名称

2,给vehicles添加元素,表示该线路增加车辆

3,判断该线路交通灯,当交通灯为绿,每隔一秒减少vehicles的第一个元素,表示通过一辆车。

代码实现:

package com.itheima.traffic; import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

import java.util.Random;

public class Road {

private List<String> vehicles = new ArrayList<String>();

private String name;

public Road(String name){

this.name = name;

ExecutorService pool = Executors.newSingleThreadExecutor();

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

// TODO Auto-generated catch block

e.printStackTrace();

}

vehicles.add(Road.this.name+"_"+i);

}

} }); ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

if(vehicles.size()>0){

boolean light = Lamp.valueOf(Road.this.name).islighted(); if(light){

System.out.println(vehicles.remove(0)+"通过");

}

}

}

},

1,

1,

TimeUnit.SECONDS); } }

2,设计一个枚举类Lamp,共有12个实例,用于表示12条线路的交通灯 属性:boolean light 用于表示交通灯状态,红或绿 String opposite 用于表示该交通灯对应的灯 String next 用于表示交通灯切换的下一个灯 方法:boolean islighted() 判断该交通灯的状态,true为绿 false为红 void Green() 将该交通灯和与之对应的灯设置为绿灯状态 Lamp Red() 将该交通灯设置为红灯状态并且把要切换的灯设置为绿灯状态并返回被切换的灯Lamp实例。 代码实现:

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 light){

this.opposite = opposite;

this.next = next;

this.light = light;

} private boolean light;

private String opposite;

private String next;

public boolean islighted(){

return light;

}

public void Green(){

this.light=true;

if(opposite!=null){

Lamp.valueOf(opposite).Green();

}

System.out.println(name()+"为绿灯");

}

public Lamp Red(){

this.light =false;

if(opposite!=null){

Lamp.valueOf(opposite).Red();

}

Lamp lampNext=null;

if(next!=null){

lampNext = Lamp.valueOf(next);

System.out.println("绿灯由"+name()+"切换为"+next);

lampNext.Green(); } return lampNext; }

}

3,设计LampControl类用于控制交通灯 属性:Lamp current 当前被设置的交通灯实例 构造方法:将S2N设置为当前交通灯并将其设置为绿灯 每隔10秒将当前灯设置为红灯并且将当前灯改为需要切换的下一个灯。 代码实现:

package com.itheima.traffic;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class LampControl {

Lamp current;

public LampControl(){

current = Lamp.S2N;

current.Green();

ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

current=current.Red();

}

},

10,

10,

TimeUnit.SECONDS);

}

}

4,设计主函数类MainClass

主函数内创建12个Road对象,创建LampControl类对象控制交通灯,运行程序

代码实现:

package com.itheima.traffic;

public class MainClass {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

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 LampControl(); }

} ---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: