您的位置:首页 > 职场人生

<黑马程序员>交通灯管理系统

2011-09-03 17:21 351 查看
---------------------- android培训java培训、期待与您交流! ----------------------

在开始一个项目时,应该先把项目的设计方法和逻辑弄清楚,然后再开始项目开发。

其中面向对象设计的时候把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。

用面向对象的方式设计如下情景:“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”。先确定有几个对象并为对象命名:Stone、StoneKnife、tree、metrial、chair;然后对拥有数据的对象添加操作方法:

StoneKnife =KnifeFactory.createKnife(Stone first ,Stone second)

material= StoneKnife.cut(tree)

chair= ChariFactory.makeChair(metrial)

在本系统中我们初步设想一下有哪些对象:红绿灯,红绿灯的控制系统,汽车,路线。汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。

接着就是要弄清楚系统之间的逻辑问题:每个十字路口总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。当有时候逻辑太过复杂,可以考虑用模拟法或者画图来使问题更加明朗,有利于问题的解决。

在本项目中用了画图的方法对问题非常直观。

最后就是开发阶段了,先编写Road的类

 

publicclass Road {

       //面向接口编程用List         

//创建线程每条路线上随机增加新的车辆,增加到一个集合中保存

   List<String>vechicles = new ArrayList<String>();

              ExecutorService pool =Executors.newSingleThreadExecutor();

              pool.execute(new Runnable(){

                     public void run(){

                            for(inti=1;i<1000;i++){

                                   try {

                                          //休息1-10秒

                                          Thread.sleep((newRandom().nextInt(10)+1 )*1000);

                                   } catch (InterruptedExceptione) {

                                          //TODO Auto-generated catch block

                                          e.printStackTrace();

                                   }

                                   vechicles.add(Road.this.name+ "_" + i);

                            }    

                     }

                    

              });

              //创建定时器,每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

              ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);

              timer.scheduleAtFixedRate(

                            new Runnable(){

                                   public voidrun(){

                                          //把第一辆车移走

                                          if(vechicles.size()>0){

                                                 booleanlighted = Lamp.valueOf(Road.this.name).isLighted();

                                                 if(lighted){

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

                                                 }

                                          }

                                   }

                            },

                            1,

                            1,

                            TimeUnit.SECONDS/*时间单位*/);

       }

}

 

 

public class Lampcontroller {
    private Lamp currentLamp;
    //整个系统中只能有一套交通灯控制系统,所以,LampController类设计成单例
    public Lampcontroller(){
       currentLamp = Lamp.S2E;
       currentLamp.light();
      
       //LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
       ScheduledExecutorServicetimer = Executors.newScheduledThreadPool(1);
       timer.scheduleAtFixedRate(
              new Runnable(){
                  public void run(){
                     //每隔10秒钟执行当前语句秒钟
                     currentLamp = currentLamp.blackOut();
                  }
              },
              10,
              10,
              TimeUnit.SECONDS);
    }
}

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

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息