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

来源:互联网 发布:淘宝618是什么活动 编辑:程序博客网 时间:2024/05/01 09:06
------------- 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/

0 0
原创粉丝点击