黑马程序员_道路交通灯管理系统,黑马交通灯
分享于 点击 30504 次 点评:131
黑马程序员_道路交通灯管理系统,黑马交通灯
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! ------------- 需求(略) 思路 1、需求简述 实现道路交通灯的控制,以便道路上的车辆能够有序行驶。 2、名词提炼找对象 道路、道路交通灯、交通灯的控制、车辆。 3、简析对象 道路:东西南北四条路,每条路上都有直行、右转、左转三种路线,所以总共有12条路线; 道路上有车,随机增加车辆数目,另路对应若为绿且该路上车则车没隔1s就离开该路。 交通灯:12条路线对应有12个灯,灯有红、绿两种状态并对应有变绿、变红方法,经过分析可知, 南路直行、右转、左转3个灯的状态与北路的直行、右转、左转3个灯的状态是完全一致的, 同样东路与西路上对应的灯也是一致的,而且所有右转灯都是绿的状态。 控制系统:通过交通灯对象的分析,交通灯控制系统可只选取南北、东西中各一条进行分析即可, 又因为灯状态是循环变化的且一条路上的直行灯优于左转,所以,可假设由南向北的灯先 变绿,就有了绿灯的循环为南向北-->南向西-->东向西-->东向南-->南向北... 车辆:该名次在此题中可将其作为路上的一个属性,道路中有个集合来装车对象。 4、类的创建(属性和行为) 道路: 属性,路名,如南向北;装车对象的集合,可用ArrayList实例;车对象可用String类表示。 行为,随机增加车辆,按条件让在路最前方的车辆通过,这两个行为都需要异步实现,要用到 多线程技术,而且有两个行为,若写在一个run方法里面会比较麻烦,从而选择JDK1.5新特性, Executors类库API及线程池思想解决该问题。 交通灯: 该类实例对象固定,十二个灯,可考虑JDK1.5新特性枚举类来实现。 属性,灯的状态可用true代表绿false代表红、对应灯的灯名、该灯变红后下一个变绿的灯的灯名。 行为,判断等的状态、让灯变绿、让灯变红、返回下一个灯。 控制系统: 属性:当前灯用以表示当前为绿灯的灯。 行为:每隔十秒将当前绿灯变为红灯并将当前灯的下一个灯变为绿灯,依次循环,需用异步实现。 5、编写主函数创建类实例对象,运行测试程序。 <代码示例>package cn.ithema.interview.traffic1;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.Random;
public class Road {
//定义路名
private String direction;
//定义集合,存储字符串车对象
private List<String> vehicles = new ArrayList<String>();
//定义构造函数
Road(String direction){
this.direction = direction;
//创建一个线程给路随机增加车辆
Executors.newSingleThreadExecutor().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();
}
vehicles.add(Road.this.direction+" "+i);
}
}
});
//创建一个定时器,用以控制道路上的车辆通行
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run() {
//先判断路上有无车辆,有车辆才有可能让其通过
if(vehicles.size()>0){
Boolean lighted = Lamp.valueOf(Road.this.direction).isLighted();
if(lighted){ //判断当前等是否为绿
System.out.println(vehicles.remove(0)+" 正在通行");
}
}
}
},
1, 1, TimeUnit.SECONDS);
}
}
package cn.ithema.interview.traffic1;
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 String opposite;
private String next;
private boolean lighted;
//构造函数,灯实例化,变明确了对应灯、下一个灯、灯状态
private Lamp(String opposite, String next, boolean lighted) {
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
//判断灯状态的方法
public boolean isLighted(){
return lighted;
}
//让灯变绿的方法,且对应灯也变绿
public void light(){
lighted = true;
if(opposite!=null)
Lamp.valueOf(opposite).light();
System.out.println("<"+name()+">为绿,此时一共有六个路线有车通过。");
}
//让灯变红的方法,对应灯也变红,且下一个灯需要变绿,为灯控制系统方便操作,次出让其返回下一个灯
public Lamp lightOff(){
lighted = false;
if(opposite!=null)
Lamp.valueOf(opposite).lightOff();
Lamp nextLamp=null;
if(next!=null){
nextLamp=Lamp.valueOf(next);
nextLamp.light();
System.out.println("此时绿灯从<"+name()+"> 切换为 <"+next+">");
}
return nextLamp;
}
}
package cn.ithema.interview.traffic1;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class LampController {
//灯总有6个灯为绿,且四个右转灯为常绿,另两个是对应灯,所以每次只需控制一个灯
private Lamp currentLamp;
//定义构造函数,并给当前灯赋值
public LampController() {
currentLamp = Lamp.S2N;
currentLamp.light();
//创建定时器,让灯循环由绿转红
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run() {
currentLamp = currentLamp.lightOff();
}
},
//参数意思依次为首次执行的延迟时间,连续执行周期,单位
10, 10, TimeUnit.SECONDS);
}
}
package cn.ithema.interview.traffic1;
public class MainClass {
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();
}
}
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------详情请查看:http://edu.csdn.net/heima/
相关文章
- 暂无相关文章
用户点评