黑马程序员——交通灯总结

交通灯管理系统学习的阶段。

     首先,我们必须牢记的是:先了解对象,再考虑怎么实现,对象中哪个向外提供方法(提供数据)。首先,我们考虑一个十字路口的场面,我们首先映入脑海的是:各种红绿灯,各种车辆。引入面向对象的思路,我们还需要一个红绿灯管理系统,路线,

再考虑考虑日常生活的常识:

-应考虑左转车辆控制信号等,右转车辆不受信号灯控制(这是我们道路管理办法规定的,右转的车辆有一条引导车道的)。这样

1.根据需求分析分为12条路线,由于线路是相对性,只要考虑从南到北,从南向西拐弯的,从东到西,从东向南拐弯这四个方向,所以只考虑这四条路线。

2.分析类

  路有东南西北等各个方向,路上面有许多车,路有车辆驶出减少的方法,路有车辆驶入增加的方法。

  灯:因为有十二条路线,所以有十二盏灯。有四对灯为重要路线灯,适合用枚举。

  汽车:汽车没有具体方法,适合用字符串表示。

  灯控制系统:控制各个方向红绿灯之间的调度。

  模拟路这个类,车辆的增加和减少:

1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车集合。

2.Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车

3.Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车

辆集合和将集合中的第一辆车移除掉

package comos.com.interview.traffic; importjava.util.ArrayList;import java.util.List;import java.util.Random;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;publicclass Road {private List<String> vechicles = newArrayList<String>();private String name = null;public Road(String name){  this.name = name;    ExecutorService pool =Executors.newSingleThrea1,

描述交通灯,每一条线路对应一个交通灯,即系统一共应该有12个灯,老师用了一个类枚举很好的很简单地解决了这个问题,每个元素都是一个对象,这样很方便的解决了问题。

package comos.com.interview.traffic;publicenum 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);//类枚举,每个元素都是一个类

交通灯控制系统,交通灯控制系统,我们只需先statt一个灯变红或者变绿,然后,再间隔一段时间(大概10秒根据实际情况),再把灯变状态就可以了

package comos.com.interview.traffic;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concurrent.TimeUnit;public class LampController {private LampcontrolLamp;public LampController() {   controlLamp = Lamp.S2N;  //首先假设某一条线路灯的状态

以上是这个系统,3个关键类的实现过程,由于能力有限,我自己也没能力能完整写出整个系统的代码,都是在老师的代码上看懂了,之后,添加上自己的注释。

 

增加

xecutorService 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){

       System.out.println(vechicles.remove(0) + " is traversing !");

      }

     }

    }

   },

   TimeUnit.SECONDS);

红绿灯的变化情况

灯变绿时,它对应方向的灯也要变绿

public void light(){

this.lighted = true;

if(opposite != null){

  Lamp.valueOf(opposite).light();

  }

System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");

}

灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿

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;

}

灯的控制器

每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿

ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

   new Runnable(){

    public  void run(){

     System.out.println("来啊");

     currentLamp = currentLamp.blackOut();

    }

   },

   10,

   10,

   TimeUnit.SECONDS);

}

产生12条路和和整个交通系统

public class MainClass {

/**

  *@param args

  */

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]);

  }

  newLampController();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值