交通灯管理系统的学习心得

来源:互联网 发布:linux 提权 编辑:程序博客网 时间:2024/05/29 08:31

     交通灯管理学习心得
   在国际化的大都市中,时时刻刻都出现着这种情况:在某一个十字路口的某个时段,有时聚集着成百上千辆车,在那里有条不紊的行驶着。
那么是什么东西保证了它们的安全的行驶呢?我想大家都想说是:交通灯吧。那么又是什么让交通灯那样有序的交替的变换来保证车辆的安全
行驶呢?那么就是它背后的交通灯管理系统这个强大的项目吧。
   学习完Java加强后,我进入了交通灯管理系统的学习。这是我第一次做这种小项目。在做的过程中有很多地方给我留下了深刻的印象,
下面我就来简单的说说我的学习心得了。
    1.关于项目模型的建立(画图)
   首先,对于交通灯管理这个项目,它取决于现实的生活中的模型。要求我们将现实生活中的东西运用代码的方式在电脑上进行模拟。对
于它我们并不陌生。但是在我们进行程序设计之前必须要将它的运行的方式给搞明白了。比如,一个十字路口有多少个灯?又分为几种颜色?
那些灯又是怎么交替的进行的?还有就是哪些灯应该是长绿的?每个灯的交换时间又是多少呢? 等等。。还有很多值得我们去好好的思考,
对于那些复杂的交通线,我们想来想去不如直接画图来的更加的简单明了,更加方便我们进行透彻的分析和理解。只要理解了那么在进行实际
的开发中就不是那么的难。
    2.面向对象的实现(分析)
   大家都知道Java的核心思想我想就是面向对象了,对于面向对象它有封装,继承和多态这么三个特征。在这个项目中我们在进行程序的代码
编写之前必须要先明白有哪些个对象,每个对象中又有哪些个属性和方法。这些都是我们先掌握的。不是有一句话叫“兵马未动,粮草先行”么?
我们只有做好充分的准备,那么在代码的书写中才会显得得心应手。行如流水。下面来看看具体的步骤吧!
   一.每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车
      1.设计一个Road类来表示路线,每个Road对象代表一条路线,总共12条路线,所以系统中总共要产生12个Road实例对象出来
      2.每天路线上随机增加新的车辆,增加到一个集合中保存。
      3.每天路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
  二.每条路线每隔一秒都会检查控制本路线的灯是否是绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
      1.设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能
        返回自己的亮黑状态。
      2.总共有12条路线,所以系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理的方式,故假
 设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
      3.除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在变成处理时,只要从这4组中各取出一个灯,对这4个灯
 依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和
 变黑的方法中,将对应方向的灯也变黑和变亮。每个灯变黑时,都伴随着下一灯的变量,Lamp类中还有一个变量来记住自己的下一个灯。
  三.每个灯都是由灯的管理器来管理它是否亮或者不亮的。
      所以应该设计一个Lampcontrol类表示一个灯的管理器。
    3.代码的实现
  注意:1.在代码的实现的过程中有一个位置我们应该注意,那就是lamp这个类,我们应该定义为枚举类型的,因为这样在以后的运用当中就会很方便
 2.还有就是线程池的运用也很巧妙。
 这是JDK1.5里面的新特性。
   具体的代码实现我就展示一下吧!
    Lamp类的实现
package com.isofe.inview.traffic;

public enum Lamp {
 S2N("N2S","S2W",false), S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2E",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 Lamp(String opposite,String next, boolean lighted){
  this.opposite = opposite;
  this.next = next;
  this.lighted = lighted;
 }
 
 private Lamp(){
  
 }
 
 private boolean lighted ;
 private String opposite;
 private String next;
 
 public boolean islight(){
  return lighted ;
 }
 
 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);
   nextLamp.light();
   System.out.println("绿灯从"+name()+"切换为------->"+ next);
  }
  
  return nextLamp;
 }
}
    LampController的实现
package com.isofe.inview.traffic;

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

public class LampController {
 private Lamp currentLamp;
 
 public  LampController(){
  currentLamp = Lamp.S2N;
  currentLamp.light();
  ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable(){
   public void run(){
    currentLamp = currentLamp.blackOut();
   }
  }, 10, 10, TimeUnit.SECONDS);
 }
 
 
}
   Load类的实现
package com.isofe.inview.traffic;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Road {
 private List<String> vehicles = new ArrayList<String>();
 private String name= null;
 
 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(10000+1000));
     } catch (InterruptedException e) {
      e.printStackTrace();
      System.out.println("汽车加载失败");
     }
     vehicles.add(Road.this.name+"  "+i);
    }
   }
  });
  
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(
  new Runnable(){
   public void run(){
    if(vehicles.size()>0){
     boolean lighted = Lamp.valueOf(Road.this.name).islight();
     if(lighted){
      System.out.println(vehicles.remove(0)+"     is Traversing!!");
     }
    }
   }
  },
  1,
  1,
  TimeUnit.SECONDS);
 }
}
    MainClass类的实现
package com.isofe.inview.traffic;

public class Mainclass {
 public static void main(String[] args){
  String[] dir = new String[]{
    "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
  };
  for(int i=0;i<dir.length;i++){
   new Road(dir[i]);
  }
  new LampController();
 }
}
总结:1.在这个项目的实现之中,用到的一些JDK1.5的新特性给我们的程序设计带来了莫大的方便和简洁。比如枚举和线程池的运用。
       也是我们以前没有用到的知识。所以对新特性的学习还是很有必要
      2.还有一点是让我出乎意料的。就是车这个事物,我们不用把它设计成一个对象。而是用一个字符串来代替。这里非常值得我
 们去思考。