黑马程序员_java学习日记_交通灯管理系统

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

交通灯管理系统需求:

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

异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。

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

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

具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

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

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

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


需求分析和逻辑设计:

1.抽取对象,此交通灯管理系统涉及到的对象有 路线Road ,交通灯Lamp ,交通工具vechicles,控制系统

经分析此系统不太涉及汽车具体的行为,只有是否移动通过,所以可以用String 字符串模拟。通过观察生活交通管理系统共有12条线路,东西南北而来的每个方向上各有三条路线,可以这样表示:
由南而来的路线:
              南向北驶  S2N   直行
              南向东驶  S2E   右转
              南向西驶  S2W   左转

由东而来的路线:
              东向西驶  E2W   直行
              东向北驶  E2N   右转
              东向南驶  E2S   左转

由北而来的路线:
              北向南驶  N2S   直行
              北向西驶  N2W   右转
              北向东驶  N2E   左转

由西而来的路线:
              西向东驶  W2E   直行
              西向南驶  W2S   右转
              西向北驶  W2N   左转

其中所有向右转的的路线和其他路线从不冲突,可以一直通行;

直行和右转冲突,也就是说同一时间直行和左转的路线的灯不能同时为绿灯;

相对应方向上的直行路线上的灯是同步的,即路线上灯的状态是一样的;

相对应方向上左转路线上的灯也是同步的,即路线上灯的状态是一样的;


我们可以按照下面的方式让路线上的车通行:

1.假如我们先让南向北方向路线上的灯为绿,则相对应方向上北向南方向路线上的灯也为绿,两条路线上的车俩开始通行;
2.10秒后南向北直行路线上的灯为红,则相对应方向上北向南方向路线上的灯也为变红,两条路线上的车停止通行;
3.接着让南向西方向左转路线上的灯变绿,则相对应 北向东左转方向路线上的等也变绿,两条路线上的车俩开始通行;
4.又10秒后南向西直行路线上的灯为绿,则相对应方向上北向东方向路线上的灯也为变红,两条路线上的车停止通行;
5接着让东向西方向左转路线上的灯变绿,则相对应 西向东左转方向路线上的等也变绿,两条路线上的车俩开始通行;
6.又10秒后东向南直行路线上的灯为绿,则相对应方向上 西向北 方向路线上的灯也为变红,两条路线上的车停止通行;

7.接着再让南向北的灯变绿.......这样就循环的控制下去

 

Road类设计:
    1.我们要产生12条路线,每条路线上对应一个灯,所以我们可以在Road 类中设计一个Lamp成员,在Road初始化的时候传进去,这样就把路线和灯实现了绑定

    2.每条路线上有很多汽车,我们可以定义一个容器来容纳汽车,并另外创建一个线程随机的往容器里添加汽车,再创建一个线程并指定一的定时器让它每隔一个时间值就去判断该路线上的灯的状态,如果灯为绿,则该路线上的车辆可以通行,用从容器里删除0角标位置的对象来模拟车辆的通行,这时要进一步判断容器中是否有元素,即判断路线上是否有车,如果有就删除。

Lamp类的设计:
字段有 : private long time 灯由亮变暗的时间
          boolean lighted 明亮状态
          String opposite 当前灯所对应的灯
          String next 下一个要亮的灯
         
    1.一条路线上对应一个灯,灯的数量是固定的12个,所以我们可以用枚举类型来设计该类
    2.我们有一个boolean变量来模拟灯的红绿状态,ture为绿灯即变亮;false为红灯,即变暗;
    3.根据面向对象的设计思想,该类内部要提供使灯变亮light(),变暗blackOut()方法,返回明暗状态的方法isLighted(),设置持续亮的时间setTime(long time);
    4当一条路线上的灯亮时,它所对应的灯也要变亮,当它变暗时,它所对应的灯也要变暗并使下一条路线上的灯变亮


         
TrafficContorller类的设计:
    此控制器可以设置那个条路线上的灯先亮,并可设置过多长时间后灯变暗;


代码编写:

 Road类代码:
package com.qiufeng.interview.traffic;

import java.util.*;
import java.util.concurrent.*;
public class Road {
private String name;

private List<String> vechicles = new ArrayList<String>();
public Road(String name){
 this.name = name;

 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);
    
   }
  }
 });
 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){
       if((vechicles.size()!=0)&&(vechicles!=null))
        
       System.out.println(vechicles.remove(0));
       
      }
     }
  
 }},
   1,
   1,
   TimeUnit.SECONDS);
 
}


}

 

 

Lamp类代码:

package com.qiufeng.interview.traffic;

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 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 = false;
 private String opposite;
 private String next;
 private Lamp(String opposite,String next,boolean lighted){
  this.lighted = lighted;
  this.opposite =opposite;
  this.next = next;
 
  
   
  }
 
 
private Lamp(){
 
 }
 public void light(){
  this.lighted = true;
  System.out.println(this.name()+"is lighted");
  if(this.opposite!=null){
   Lamp.valueOf(opposite).light();
  }
 try {
  Thread.sleep(10000);
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 blackOut();
 }
 public void 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;
 }
 public boolean isLighted(){
  
  return lighted;
 }
 
 
}


TrafficController类代码:

 


package com.qiufeng.interview.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TrafficController {
   private Lamp currentLamp;
 public TrafficController(Lamp startLamp){
    this.currentLamp = startLamp;
 currentLamp.light();
 /*ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
 timer.scheduleAtFixedRate(
   new Runnable(){
    public void run(){
     
     //currentLamp = currentLamp.blackOut();
     
     }
  
 },
   2,
   2,
   TimeUnit.SECONDS);
    
 
*/ 
}
}

 

MainClass:

package com.qiufeng.interview.traffic;

public class MainClass {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //产生南向而来直行和左转的路线
  Road s2n = new Road("S2N");
  Road s2w = new Road("S2W");
  //产生东向而来直行和左转的路线
  Road e2w = new Road("E2W");
  Road e2s = new Road("E2S");
  //产生北向而来直行和左转的路线
  Road n2s = new Road("N2S");
  Road n2e = new Road("N2E");
  //产生西向而来直行和左转的路线
  Road w2e = new Road("W2E");
  Road w2n = new Road("W2N");
  //产生右转路线对象
  Road s2e = new Road("S2E");
  Road e2n = new Road("E2N");
  Road n2w = new Road("N2W");
  Road w2s = new Road("W2S");
  System.out.println("交通灯管理系统开始工作。。。。。。");
 //Lamp.S2N.light();
  TrafficController controller = new TrafficController(Lamp.S2N);
 }

}

 

 

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值