首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师_交通灯管理系统(二)

2012-10-09 
黑马程序员_交通灯管理系统(二)---------------------- android培训、java培训、期待与您交流! ------------

黑马程序员_交通灯管理系统(二)

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

?

?

????????????呵呵...首先申明该系统的原版权属于张孝祥老师,本人只是学习了该项目,重新根据张老师的思路写了一下代码,下面贴出代码只为交流和学习,能从中学习一些面向对象的设计技巧,以及一些编程的技巧:

?

?????????? 就比如在Lamp类中如果在构造方法中传入的灯依然是枚举类型的话就会报错,应为枚举类中的每一个元素在使用之前必须声明,而在Lamp这个枚举类中

当传入前四个灯所对应的灯的时候,所对应的这四个灯还没有声明,所以将其名字作为一个字符串出入,而不是以一个枚举类型出入,后面在使用的时候再通过valueOf(String arg0)方法将其转化成一个枚举对象。

?

??????????? Road类的代码如下:

??

package cn.itcast.trafficlamp;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/** * 该类表示路线,每一个Road对象就表示一条路线,系统中一共有12条路线 * 随机的为路面上增加车辆,并将其保存在一个List集合当中,每过一秒对 * 其路线上的的灯进行检查,如果为绿色就将车辆移走 */public class Road {/** 定义一个集合用于村存放路上面的车 */private List<String> vehicles = new ArrayList<String>();/** 用此属性来表示每条路的名字 */private String name = null;public Road(String name) {this.name = name;// 此处实例化一个线程池ExecutorService pool = Executors.newSingleThreadExecutor();// 执行一个线程任务,随机的为路面上增加车辆pool.execute(new Runnable() {@Overridepublic void run() {for (int i = 1; i < 1000; i++) {try {Thread.sleep((new Random().nextInt(10) + 1) * 1000);} catch (InterruptedException e) {e.printStackTrace();}// 向集合中随机的增加车辆,此处是在内部类当中要访问外部类的// 成员变量name有两种方法:// 1,在构造方法的参数列表中将name声明为final类型的// 2,使用 (外部类.this.属性名 )这种形式访问vehicles.add(Road.this.name + "_" + i);}}});// 此处实例化一个定时器,每隔一秒可让路线上通过一辆车ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {if (vehicles.size() > 0) {boolean lighted = Lamp.valueOf(Road.this.name).isGreen();if (lighted == true) {System.out.println(vehicles.remove(0) + " is traversing !");}}}}, 1, 1, TimeUnit.SECONDS);}}

?

?

?

??????????? Lamp类的代码如下:

?

package cn.itcast.trafficlamp;/** * 此类是一个枚举类表示灯,系统中一共有12条路线,其中有8条路线是受信号灯控制的即前8条, * 后面四条路线是不受信号灯控制的现在为了统一编程模型也假设这4个灯受信号灯控制, * 不过是将其设置为常绿的状态 * */public enum Lamp {/* 每一个枚举元素都代表着一个方向上的灯*/S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),/* 下面的每一个灯都与上面的灯相对应,而这4个灯相对应的灯则设置为null,以避免在红绿灯之间切换时进入死循环*/N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),/* 下面4个灯即为拐角处的假想的4个灯,没有对应灯,也没有下一个灯,并将其设置为常绿的状态*/S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);/** 用此属性表示当前灯所处的状态是否为绿色 */private boolean green;/** 用此属性表示当前的灯所对应的灯 */private String oppositeLamp;/** 用此属性表示当前灯变红时下一个要变绿的灯*/private String next;private Lamp(String oppositeLamp,String next,boolean green){this.oppositeLamp = oppositeLamp;this.next = next;this.green = green;}/** 此方法返回一个当前灯的状态 */public boolean isGreen() {return green;}/**  * 此方法用于将当前灯变绿,并且让与该灯相对应的灯也变绿 */public void turnGreen() {this.green = true;if (oppositeLamp != null) {Lamp.valueOf(oppositeLamp).turnGreen();}System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");}/**  * 此方法用于将当前灯和与之相对应的灯变红,并且返回下一个要变绿的灯 */public Lamp goRed(){this.green = false;if (oppositeLamp != null) {Lamp.valueOf(oppositeLamp).goRed();}Lamp nextLamp = null;if (next != null) {nextLamp = Lamp.valueOf(next);System.out.println("绿灯从" + name() + "-------->切换为" + next);nextLamp.turnGreen();}return nextLamp;}}

?

???????? 控制器LampController类的代码如下:

package cn.itcast.trafficlamp;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.turnGreen();// 设计一个定时器每隔10秒钟就将当前的灯变红,将下一个灯变绿ScheduledExecutorService timer = null;timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// 将当前灯变红的同时返回下一个要变绿的灯currentLamp = currentLamp.goRed();}},10, 10, TimeUnit.SECONDS);}}

?

?

????????测试类TrafficLampTest类的代码如下:

package cn.itcast.trafficlamp;public class TrafficLampTest {public static void main(String[] args) {// 构造12条路线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培训、期待与您交流! ----------------------

?

详细请查看:http://edu.csdn.net/heima

?

?

?

热点排行