交通灯管理系统

来源:互联网 发布:淘宝网代购服务点利润 编辑:程序博客网 时间:2024/06/01 20:40

------- 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();//实例化灯控制器的类


 

 

原创粉丝点击