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

来源:互联网 发布:178软件源 编辑:程序博客网 时间:2024/06/03 23:40

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------

需求


模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

 异步随机生成按照各个路线行驶的车辆。

例如:

       由南向而来去往北向的车辆 ---- 直行车辆

       由西向而来去往南向的车辆 ---- 右转车辆

       由东向而来去往南向的车辆 ---- 左转车辆

       。。。

 信号灯忽略黄灯,只考虑红灯和绿灯。

 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

 注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


分析

每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。
设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
每条路线上随机增加新的车辆,增加到一个集合中保存。
每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。
总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。
无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。
设计一个LampController类,它定时让当前的绿灯变红。



对涉及到的类的设计和分析

Road类
public class Road {      private List<String> vechicles = new ArrayList<String>();            private String name =null;      public Road(String name){          this.name = name;          //Road对象一初始化就交通工具在上面跑          //模拟车辆不断随机上路的过程               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) {                          e.printStackTrace();                      }                      vechicles.add(Road.this.name + "_" + i);                  }                             }                        });                    //每隔一秒检查对应的灯是否为绿,是则放行一辆车  //这里使用的是JDK1.5新版本的线程类           ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);          timer.scheduleAtFixedRate(                  new Runnable(){                      public void run(){                          if(vechicles.size()>0){                              boolean lighted = Lamp.valueOf(Road.this.name).isLighted();                              if(lighted){  //这里的放行是用remove方法,即从路的集合中移除一辆车,而不考虑车的运动轨迹这些东西                                System.out.println(vechicles.remove(0) + " is traversing !");                              }                          }                                                }                  },                  1,                  1,                  TimeUnit.SECONDS);                }  } 


Lamb类

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 lighted){          this.opposite = opposite;          this.next = next;          this.lighted = lighted;      }          /*当前灯是否为绿*/       private boolean lighted;      /*与当前灯同时为绿的对应方向*/         private String opposite;      /*当前灯变红时下一个变绿的灯*/         private String next;      public boolean isLighted(){          return lighted;      }            /**      * 某个灯变绿时,它对应方向的灯也要变绿      */       public void light(){          this.lighted = true;          if(opposite != null){              Lamp.valueOf(opposite).light();          }          System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");                }            /**      * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿      * return 下一个要变绿的灯      */       public Lamp blackOut(){          this.lighted = false;          if(opposite != null){              Lamp.valueOf(opposite).blackOut();          }                           Lamp nextLamp= null;          if(next != null){              nextLamp = Lamp.valueOf(next);              System.out.println("绿灯从" + name() + "-------->切换为" + next);                        nextLamp.light();          }          return nextLamp;      }  }  

LampController类


public class LampController {      private Lamp currentLamp;            public LampController(){          //刚开始让由南向北的灯变绿;               currentLamp = Lamp.S2N;          currentLamp.light();                    /*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/                ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);          timer.scheduleAtFixedRate(                  new Runnable(){                      public  void run(){                          System.out.println("来啊");                          currentLamp = currentLamp.blackOut();                  }                  },                  10,                  10,                  TimeUnit.SECONDS);      }  }  


应用端

public class MainClass {        /**      * @param args      */      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();      }    }  

总结

这个项目很好地加深了对面向对象设计的理解,在设计程序过程中中涉及到哪些对象,哪些对象需要定义相应的类,哪些不用,多线程的应用,定时器,枚举,匿名内部类,如何把设计出来的程序更贴近实际,设计程序中使用的技巧的解决问题的方法和设计逻辑,都让人受益匪浅,Java确实是门优美的语言。

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 舍不得花40块钱怎么办 空调铜管折弯了怎么办 沈阳学叉车证怎么办 幼儿老师教不会怎么办 学东西学不会怎么办 学不会汽修怎么办 挖掘机发票丢了怎么办 工会经费多缴怎么办 机票姓名错了怎么办 抹胸衣服下掉怎么办 穿抹胸很容易掉怎么办 抹胸衣服老掉怎么办 群里有低俗的人怎么办 老师不收礼物怎么办 发票跨年了怎么办 一用力就头疼怎么办 小孩天天玩游戏怎么办 手机分期人死了怎么办 人死了手机欠费怎么办 晚上想玩手机怎么办 孩子溺水后发烧怎么办 去台湾多次签证怎么办 怀孕不能玩手机怎么办 孕期天天玩手机怎么办 小孩子在家偷钱怎么办 小朋友被鸡抓伤怎么办 宝宝在学校不说怎么办? 宝宝不和小朋友玩怎么办 初中孩子不想上学怎么办 孩子装病不想上学怎么办 中学生叛逆不愿意上学怎么办 孩子去幼儿园哭闹怎么办 孩子哭闹不上学怎么办 孩子中班还哭怎么办 小孩子不爱上幼儿园怎么办 小孩子不爱去幼儿园怎么办 宝宝去幼儿园哭闹怎么办 宝宝上幼儿园哭闹怎么办 小朋友上幼儿园哭闹怎么办 迷路了怎么办幼儿故事 大班迷路了怎么办故事