交通灯管理系统

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

1、需求分析:
 在一个路口中行驶的线路会有12条,而在这12条的线路中有4条的线路上的车是自由行驶的。也就是向右转向的车
 设计时可以设计为常态。不必去考虑其他的问题,而剩下的8条线路就形成了4组也就是“南北直行”,“南到西”,
 “北到东”,“东西直行”,“东到南”,“西到北”。这样的四组线路。
2、分析和设计:
 初步的设想应该为4个对象。汽车,灯,灯控制器,路。因为不需要出车子的移动过程,值是通过路口的那一时刻
 所以只需要3个对象,灯  灯的控制器  和路。
 在路的这个对象中有增加车辆的方法和减少车辆的方法。
 面向对象设计的重要经验:谁拥有数据谁就对外提供操作这些数据的方法。
 在设计灯的类的时候值需要设计四组灯的逻辑即可,因为有另外的四组灯是与这四组灯是相反的
 而另外的四组灯设计为常亮的状态的。所以在设计灯的类的时候就要使用到了枚举,用枚举来设计这
 四组灯的对象。在灯的属性上只有三个属性:相反方向的灯,下一个方向的灯,和灯的点亮状态
3、根据上面的设计来编写出代码:
Road.java这个类:
其中有两个方法是增加路上的车,和路上的车消失
用到了两种的方法
增加路上的车是用的线程的方法:

ExecutorService pool = Executors.newFixedThreadPool(1);//这是一个线程池的概念  
  pool.execute(new Runnable(){

   @Override
   public void run() {
    // TODO Auto-generated method stub
    for(int i=0;i<100;i++){
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     vechicles.add(Road.this.name+"_"+i);
    }
   }});



 

 

路上消失的车需要用到了定时器,去定时的让路上的车消失
 

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable(){ 
     public void run(){
     boolean ligther = Lamp.valueOf(Road.this.name).isLigthed();
     if(ligther){
      System.out.println(vechicles.remove(0)+"is traversing !");
      
     }
    }
   },
     1,//每个多少秒让车消失
     1,
     TimeUnit.SECONDS);


 

 

来定义灯的类:其中使用到了枚举:每一个灯就是一个对象,而每一对象中都有三个属性

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;     //下一个灯的属性



 
灯亮的方法:

 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秒钟一变

 control = Lamp.S2N;
  control.light();
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable(){
   public void run(){
    control = control.blackOut();
   }
  },
    10,
    10,
    TimeUnit.SECONDS);
 }

 


 


 

然后再写一个测试的类:
 一起初始化那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 LampControl();//实例化灯控制器的类


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值