黑马程序员:交通灯管理系统分析及代码实现

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:28   2806   0
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------交通灯管理系统

对象分析:


控制器

对象的变量和方法分析:

变量:车
方法:增加、减少车辆


变量:12种不同路线的灯,其中向右转的4条路线的灯看成永远是绿灯
方法:开灯(开灯的时候需开启相对的灯)、关灯(关灯的时候要开启下一个灯,还需返回下一个灯,因为在控制器中有一个固定频率的转换灯状态的方法,需要获得下当前灯(即上面说的下一个灯))
因为是固定的12种不同路线的灯,所以这里需定义为枚举类
剩下的8种不同路线的灯因为是相对的关系,所以可以看成是4组等,开灯的时候若有相对的等,则开启

控制器
方法:启动一个线程池,根据固定的频率变换灯的状态


Lamp:灯
/*
 * 灯
 * 共12种路线,即12种灯,向右转这种特殊方式把他看成绿灯,一直可通行
 * 另外8种灯是相对的,可以看成是4组,当灯亮时,对应的灯也亮,关闭也是同理
 * 灯关闭的时候,下一个路口的等就要变亮
 * 变亮=绿灯
 * 关闭=红灯
 * 这里不考虑黄灯
 */
package cn.itcast.Mr_Zhang.traffic;


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 boolean lighted;
 //相对应的灯
 private String opposite;
 //下一个灯
 private String next;
 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(){
  this.lighted=true;
  if(opposite!=null){
   Lamp.valueOf(opposite).light();   
  }
  System.out.println(name()+"变为绿灯,共有6个方向可以通行");
 }
 //关灯操作,关闭此等后需要吧下一个灯点亮,这里需要返回下一个灯,因为在LampController中,每10秒关闭灯,开启下一个灯,需要将nextLamp赋值给currentLamp
 public Lamp closeLight(){
  this.lighted=false;
  if(opposite!=null){
   Lamp.valueOf(opposite).closeLight();
  }
  Lamp nextLamp = null;
  if(next!=null){
   nextLamp=Lamp.valueOf(next);
   System.out.println(name()+"灯变红,下一个灯:"+next+"变绿灯");
   nextLamp.light();
  }
  return nextLamp;
   
 }
 
}

LampController:灯控制器
package cn.itcast.Mr_Zhang.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();
   //每10秒关闭当前灯,开启下一个灯
   ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
   timer.scheduleAtFixedRate(
     new Runnable(){
      public void run(){
//       closeLight方法返回的Lamp赋值给currentLight
       currentLamp = currentLamp.closeLight();
      }
     }, 
     15, 
     15, 
     TimeUnit.SECONDS);
   
  }
  
 
}

Road:路
/*
 * 路的功能:
 * 随即增加车辆,定时减少车辆,把车辆看成是路中的数据,从而把车辆存储到集合中
 * 因为在增加和删除过程中,需要有延时的效果,所以在构造函数中需要吧该执行代码放入到一个线程池中
 * 让另一个线程执行,不然的话,这个对象一直创建不起来,创建的时候还在等待。
 */
package cn.itcast.Mr_Zhang.traffic;


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;


public class Road {
 private List<String> vehicles = new ArrayList<String>();
 private String name;


 public Road(String name) {
  this.name = name;
  // 模拟在路上随机增加1000辆车,因为不可能等创建完1000辆车之后才检查灯的状态,所以这里需要创建单独的线程执行
  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) * 200);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     vehicles.add(Road.this.name + '_' + i);
    }
   }
  });


  // 每隔1秒检查是否是绿灯,若是绿灯,则汽车通过,即减少一辆汽车
  ScheduledExecutorService schedulePool = Executors
    .newScheduledThreadPool(1);
  schedulePool.scheduleAtFixedRate(new Runnable() {
   public void run() {
    boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
    if (lighted) {
     System.out.println(vehicles.remove(0) + " is through");
    }
   }
  }, 1, 1, TimeUnit.SECONDS);
 }
}

RunTraffic:启动模拟交通灯管理系统
package cn.itcast.Mr_Zhang.traffic;
public class RunTraffic {


 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String[] roads = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S",
    "N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
  
  // 生成12个方向的路线
  for (int i = 0; i < roads.length; i++) {
   new Road(roads[i]);
  }


  // 产生交通灯系统
  new LampController();
 }


}



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP