------------------------------------------------------Android培训   Java培训   期待与您交流-----------------------------------------------------------

图形对理解程序的设计是有很大帮助的,可以自己先观察再画张图,通过对图像的分析,可以看出总共有十二条路线,而又转向的路灯可以看作是常绿的
哪些对象呢?红绿灯  红绿灯的控制器  汽车  路  

把路对象看作是一个泛型集合是很有意思的也是很高明的一种简洁思路,集合中的数据就是汽

车,这也就是省去了汽车对象,精简了程序的设计。
private List<String> vechicles = new ArrayList<String>();
这个集合使用了面向接口的编程
面向接口的编程的好处有哪些
棉线接口这种实例化方式称之为向上传递。
ArrayList是实现了List接口的。

如果使用这种方式
private ArrayList<String> vechicles = new ArrayList<String>();
那么,vechicles只能访问到ArrayList自己的属性或者是方法。
如果是用这种方式
private List<String> vechicles = new ArrayList<String>();
这种定义只可以使用List接口中在ArrayList实现的方法。

比如有这么一个方法供别人调用:
public List getXXXList(){
  List list = new ArrayList();
  ...
  return list;
}

现在是new ArrayList(),如果万一以后要改成new LinkedList()的话,这个方法的返回类型

就不需要改了,并且调用这个方法的所有类都不需要修改,这样就降低了修改程序的成本和风

险,提高了程序的可复用性。

试想如果提供了这样的几个方法:
1、public void myMethod(List list){......}
2、public void myMethod(ArrayList list){......}
3、public void myMethod(LinkedList list){......}

对调用者而言,谁的灵活性更高?显然是第一个。
因为从调用这个方法的人来说,对第一种方法,以下几种写法都是可以的:
myMethod(new ArrayList());
myMethod(new LinkedList());
这就是面向接口编程的好处。

路有车辆的离开和加入,同样集合也应该提供增加数据和减少数据的方法来模拟车辆的加入和

离开

                //模拟车辆不断随机上路的过程        
        ExecutorService pool = Executors.newSingleThreadExecutor();
        pool.execute(new Runnable(){
            public void run(){
                for(int i=1;i<1000;i++){
                    try {
                        Thread.sleep((new Random

().nextInt(10) + 1) * 1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    vechicles.add(Road.this.name + "_" + i);
                }                
            }
           
        });

               //每隔一秒检查对应的灯是否为绿,是则放行一辆车        
        ScheduledExecutorService timer = 

Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(
                new Runnable(){
                    public void run(){
                        if(vechicles.size()>0){
                            boolean lighted =

Lamp.valueOf(Road.this.name).isLighted();
                            if(lighted){
                               

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);
}
红绿灯中向右转向的可以看作是常绿的不考虑,一边的灯和对面的应该是一致的
这样就考虑有逻辑的四个灯就行了,一个灯变绿,对面的灯变绿,相邻(左转向)的灯变红,

这个灯变红,对面的灯变红,
相邻(左转向)的灯变绿


回头恶补线程和内部类,张老师讲的定时器没听的十分明白。加油

 

------------------------------------------------------Android培训   Java培训   期待与您交流-----------------------------------------------------------

posted on 2011-09-15 15:25  www_ding@163.com  阅读(506)  评论(0编辑  收藏  举报