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

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

2014-04-18 16:49 309 查看
先画出图以便于分析问题:



项目分析:

用面向对象的方式思考:项目中出现的对象分别有:路灯、路灯控制器、路。因为项目的侧重点是路灯,所以就把路上行驶的车看做是路的一个属性,并且路会根据路灯确定是否让车子前进,路还有向自己增加车子的方法。

具体要写代码的思路:

1、路灯

首先“路灯”因该是一个枚举类型,因为此项目中有12条不同的路,每条路上都要有一个路灯,所以路灯的实例因该只有12个。用面向对象的方式思考:谁拥有数据谁就应该提供操作这些数据的方法,则路灯因该有控制自己变红和变绿的方法,而且还要有向外部提供自己现在是红灯还是绿灯的方法。

2、路灯控制器

顾名思义,路灯控制器就因该控制路灯的变化,当new出一个路灯控制器的实例时它就因该不停的工作,所以它因该创建一个新线程,又因为路灯的变化是一个有规律的死循环,则考虑到用一个有频率的定时器来实现这个功能。

3、路

分析可知一共有12条不同的路线,所以路对象因该只创建12个不同的实例。路还因该有一个集合类,用来保存路上的车。路还因该有一个方法用来管理路上的车能否通过十字路口,路还因该有一个向自己添加车辆的方法。而且这两个方法都因该是一个单独的线程在运行,并且是在路创建的时候就开始运行了,所以在路的构造方法中因该创建了两个线程来执行这两个不同的方法。

下面是这个项目的代码实现:

1、路灯的代码:

[java] view
plaincopy

package com.hbsi.interview.traffic;

public enum Lamp {

//因为路灯间是有逻辑关系的,所以只控制这四个灯,其他的灯就都能够确定是什么状态了

S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",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 condition;

private String next;

private String equal;

private Lamp(String next,String equal,Boolean condition){

this.next = next;

this.equal = equal;

this.condition = condition;

}

public Boolean isLighted(){

return condition;

}

//让灯变成绿灯的方法

public void light(){

condition = true;

if(equal!=null){

Lamp equalLamp = Lamp.valueOf(equal);

equalLamp.light();

System.out.println(this+" Lamp is green,会有六个方向通车");

System.out.println(equalLamp+" Lamp is green,会有六个方向通车");

}

}

//让灯变成红灯的方法

public Lamp blackOut(){

this.condition = false;

Lamp nextLamp = null;

if(equal!=null){

Lamp.valueOf(equal).blackOut();

}

if(next != null){

nextLamp = Lamp.valueOf(next);

nextLamp.light();

}

return nextLamp;

}

}

2、路灯控制器的代码:

[java] view
plaincopy

package com.hbsi.interview.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();

Boolean roadLamp = Lamp.valueOf("S2N").isLighted();

ScheduledExecutorService tmer = Executors.newScheduledThreadPool(1);

tmer.scheduleAtFixedRate(

new Runnable(){

@Override

public void run() {

currentLamp = currentLamp.blackOut();

}

},

10,

10,

TimeUnit.SECONDS);

}

}

3、路的代码:

[java] view
plaincopy

package com.hbsi.interview.traffic;

import java.util.*;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class Road {

private String name;

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

public Road( String name){

this.name = name;

//在创建Road的同时,向路上添加车

ExecutorService pool= Executors.newSingleThreadExecutor();

pool.execute(new Runnable(){

@Override

public void run(){

for(int i=1;i<1000;i++){

try {

Thread.sleep((new Random().nextInt(10)+1)*1000);//路添加车辆的速率会有所不同

} catch (InterruptedException e) {

e.printStackTrace();

}

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

//System.out.println(Road.this.name+"添加第"+i+"辆车");

}

}

});

//路创建后因该不断的判断自己路上的车能不能通过路口

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

@Override

public void run(){

if(interview.size()!=0){

Boolean roadLamp = Lamp.valueOf(Road.this.name).isLighted();

if(roadLamp){

System.out.println( interview.remove(0));

}

}

}

},

1,

1,

TimeUnit.SECONDS);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: