黑马程序员--交通灯

来源:互联网 发布:回溯算法 八皇后问题 编辑:程序博客网 时间:2024/06/07 21:42

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

 

项目总结:每天我们在马路上,经常会遇到交通灯。但是我们只是去遵守它的规则,很少去了解他的工作原理,其实在做这个项目之前我真的不知道交通灯这个项目可以分出12条路线来,如果是我分析可能就会分析出8条线,而把向右转常绿的这几条线给忽略。通过这次项目我学会了,做项目一定要把项目分析透彻做到精益求精。否则会忽略很多重点的东西,最后一定会失败的!还有就是我们在为客户些项目的时候,一定要站在客户的角度去考虑问题,要全面。如果交通灯是我做,而我没有分析出有12条路线,呵呵,也许项目完成之后,一定会出现交通事故的。呵呵。。所以这也是我自己以后再工作或者学习当中要注意地,做什么事都要细心。

 

Native2Ascii和DOM4j,其中的“2”表示“to”的简写,“4”表示“for”的简写,这时程序员圈子里流行的一种对“to”和“for”进行间歇的习惯!

面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。在牢牢掌握几个典型的案例就可以了:人在黑板上画圈,列车司机紧急刹车,售货员统计售货 小票金额,你把门关上了等。


面试题:两块石头变成一把石刀,用石刀去砍树,用木头去做成椅子?

Stone  石头
StoneKnife  石刀
tree    树
mateial   木材
Chair  椅子


//石刀加工厂,里面有个方法,把石头做成石刀,又说是两块石头,所以传进参数应该是两个石头
StoneKnife=KnifeFactory.createKnife(Stone first,Stone second);
//木材加工,把树变成木材的方法,传进参数为树
mateial=stoneKnife.cut(tree);
//椅子 椅子加工厂,有个做椅子的方法,那么方法传进参数为木材
Chair=ChairFactory.makeChair(material);

 

枚举的构造方法必须是私有的private类型


Road类的编写(路线)
 
 每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。

 在Road对象的构造方法中启动一个县城每隔一个一个随机的时间向vehicles集合众增加一辆车(用一个“路线名_id”形式的字符串进行表示).

 

 //路上面车的集合
 List<String> vehicles=new ArrayList<String>();
 private String name;
 public Road(String name) {
  this.name = name;
  //创建一个线程池,并指定线程池中用1个线程
  ExecutorService pool=Executors.newScheduledThreadPool(1);
  
  pool.execute(new Runnable(){
   public void run(){
    //循环往这条路上面加车辆。。。。1000只是为了模拟数据
    for (int i = 1; i < 1000; i++) {
     try {
      Thread.sleep((new Random().nextInt(10))+1);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     //这里用到的时这条路的名字加上数组里面的第几辆车
     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).isLighted();
       if (lighted) {
        System.out.println(vehicles.remove(0)+"is  turn");;
       }
      }
     }
    },
    1,
    1,
    TimeUnit.SECONDS
    );
 }


 
 然后写灯的类Lanp。


public enum Lamp {
 //N2S,N2E,W2E,W2N,S2N,S2W,E2W,E2S,S2E,E2N,N2W,W2S;
 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 Lamp(String opposite,String next,boolean lighted){
  this.opposite=opposite;
  this.next=next;
  this.lighted=lighted;
 }
 
 private boolean lighted;//灯是不是亮的
 private String opposite;//对应的灯
 private String next;//下一个灯
 public boolean isLighted(){
  return lighted;
 }
 
 //绿灯
 public void Green(){
  this.lighted=true;
  if (opposite!=null) {
   Lamp.valueOf(opposite).Green();
  }
  System.out.println(name()+"Lamp   is   green");
 }
 
 
 //红灯
 public Lamp Red(){
  this.lighted=false;
  if (opposite!=null) {
   Lamp.valueOf(opposite).Red();
  }
  Lamp nextLamp=null;
  if (next!=null) {
   nextLamp=Lamp.valueOf(next);
   nextLamp.Green();
   System.out.println("灯从"+name()+"-->"+next);
  }
  return nextLamp;
 }
}

 

 

 

灯的控制器
 //这是一个当前灯的对象
 private Lamp currentLamp;

 public LampController() {
  //假设当前等的对象为  S2N
  currentLamp=Lamp.S2N;
  //并且让这个灯为绿色
  currentLamp.Green();
  
  //定时器
  ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
  //两秒后开始调用该方法,并且每2秒循环一次。
  timer.scheduleAtFixedRate(
    new Runnable(){
     public void run(){
      currentLamp=currentLamp.Red();
     }
    },
    2,
    2,
    TimeUnit.SECONDS
    );
 }

 

 

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------