黑马程序员_交通灯管理

来源:互联网 发布:ghostscript知乎 编辑:程序博客网 时间:2024/06/05 07:55


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

   交通灯管理系统的需求分析:

异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
……
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

   谁拥有数据,谁就对外提供操作这些数据的方法。

   面向对象的设计需求,先要分析对象

   初步分析 会有四个对象

   1.路线

    Road 表示路线,一共有12条路线,每一条的路线名字是不同的,所以要创建Road的12个实例对象.

    路线要具备的方法:

     增加车辆

     减少车辆

   2.红绿灯

    Lamp类来表示交通灯,因为有12条路线,所以一共就有12交通灯来表示路线,因为右拐弯不受灯的限制,但是为了让系统有统一的管理方式,假如四个右拐弯有交通灯,四个交通的状态是常亮的。

    除了右拐弯的灯以后,还有八个交通灯,因为交通灯的是两两相对的,所以可以分成四组,从这四组中各取出一个灯来控制,与这个灯对应的灯,的状态随着控制灯的变换而变换。

     假如:由南道北的灯是亮的

     对应的灯: 由北到南的灯也是亮的

     下一个灯: 由南到西的灯是不亮的

     对应的灯: 由北到东的灯是不亮的

   3.红绿灯控制器

     lampController类 来表示交通控制器,因为控制器是单一的,最好是用单例模式来设计,也可以用枚举来实现。

   4.汽车

     因为只需要捕捉汽车瞬间移过路口,所以汽车的设计可以用字符串表示。

    

 //路线
public class Road {
   private List<String>vehicle=new ArrayList<String>();
   String roadName;
   public Road(String roadName){
    this.roadName=roadName;
    //用 Executors newSingleThreadExecutor()创建多线程 用 execute()启动run()方法里面的代码
  ExecutorService execSer= Executors.newSingleThreadExecutor();
  execSer.execute(new Runnable(){
   public void run(){
     try {
    Thread.sleep(new Random().nextInt(10)+1*1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
     for(int i=0;i<1000;i++){
     vehicle.add(Road.this.roadName+"方向的车"+i);
   
      }
   }
  });
 //用  Executors 创建定时器 newScheduledThreadPool
    ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
      
     timer.scheduleAtFixedRate(
       new Runnable(){
        public void run(){
         if(vehicle.size()>0){
          boolean  lighted=Lamp.valueOf(Road.this.roadName).isLighted();
          if(lighted){
           System.out.println(vehicle.remove(0)+"车开走 !");
          }
         }
        }
       },
       1,
      1,
      TimeUnit.SECONDS );
   }
}

   路线图片:

 

//灯
public enum Lamp {
  南(S) 北(N) 东(E)西(W)
  需要控制的等,可以分成四组,单独控制每组灯里的一个。
  南到北  南到西  东到西  东到南
  北到南  北到东  西到东  西到北
  右拐灯:不需要控制,常亮
  南到东  东到北  北到西  西到南
  *
   S2N,S2W,E2W,E2S,
      N2S,N2E,W2E,W2N,
      W2S,S2E,E2N,N2W;
 
   //要控制的四个灯
   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),
      //右拐弯常亮的四个灯
      W2S(null,null,true),S2E(null,null,true),
      E2N(null,null,true),N2W(null,null,true);
      private Lamp(){};
      //因为枚举要先定义后才能使用,所以这就构造函数不直接接收灯的对象,而是接收灯的名字。
      private Lamp(String opposite,String lignext,boolean lighted){
       this.opposite=opposite;
       this.lignext=lignext;
       this.lighted=lighted;
      }
      //接收对应灯的名字
      private String  opposite;
      //接收下一个灯的名字
      private String lignext;
      //灯的状态
      private boolean lighted;
       //返回灯的状态
      public boolean isLighted(){
       return lighted;
      }
      //灯变亮方法
      public void light(){
      
       this.lighted=true;
       //让对应的灯变亮
       if(opposite!=null)
        Lamp.valueOf(opposite).light();
      
       System.out.println("下面可以看到六个方向的灯------------>");
      
      }
      //灯变暗方法
      public Lamp backlight(){
       this.lighted=false;
       //让对应的灯变暗
       if(opposite!=null)
        Lamp.valueOf(opposite).backlight();
       //让下一个灯变亮
      
       if(lignext!=null){
        Lamp temp=Lamp.valueOf(lignext);
      temp.light();
      System.out.println("灯切换了---由 "+this.toString()+"----------"+"到"+lignext+"--->");
      return temp;
       }
       return null;
      }
}

 

 

//灯控制器
public class LampController {
       
 //当前灯
 private Lamp  currentLamp;
 
 public LampController(){
  this.currentLamp=Lamp.S2N;
  //调用灯变亮方法
  currentLamp.light();
 ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
 timer.scheduleAtFixedRate(
   new Runnable(){
    public void run(){
    currentLamp=currentLamp.backlight();
    }
   },
   3,
   3,
    TimeUnit.SECONDS);
 }
}

 

//测试类
public class LampMainTest {

  public static void main(String[]arge){
     String[] road={ "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","W2S","S2E","E2N","N2W"};
      for(int i =0;i<road.length;i++){
       new Road(road[i]);
      }
      new LampController();
  }
}

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

0 0
原创粉丝点击