---------------------- android培训、java培训、期待与您交流! ----------------------
Java是面向类的设计方式是,在用java解决交通灯问题时要充分分析交通灯中的各个类。特别要注意张老师在《精通面向类的分析和设计之秘诀》时说的几个典型面向类的例子,记住一句话——谁拥有数据,谁就对外提供操作这些数据的方法。但是张老师说“售货员统计收获小票的金额”是小票自己在算(小票自己能算?),我是这样理解的,小票拥有数据,所以把小票设计成一个类,该类中包含统计金额的功能(不知道对不对);其他的几个例子还是可以理解。回到交通灯的问题,交通灯的灯就不总结了,张老师的图示法很有效,一看就能明白;然后看整个问题包含的可能类:灯,车,路。灯肯定是有的,因为灯要产生控制车流动的信号量;车,听了张老师的分析,我们知道,车只不过是一个表示车辆已经通过的信号,没有必要设计成类,设计了更麻烦;还有路,按照谁拥有数据(这里是车),谁就对外提供操作这些数据的方法,所以路要是一个类,用来操作车辆。我觉得整个过程就是灯类产生信号,传递给路类,路类根据灯信号操作车辆。说起来容易做起来难啊,如果不听张老师的讲解,这点知识我也总结不出来。
灯类包括灯类和灯控制类(可以只用一个类来完成这两个类的功能,但是把灯抽取出来在结构上更清晰),灯控制类是初始化灯的红绿并产生定时器控制灯由绿变红,张老师在讲解这点时还提到一个技巧,就是当前将要变红的下一个灯调用blackOut()方法,该方法返回的是下一个将要变绿地灯,这样灯系统就可循环了(实际上,灯只在四个灯之间循环变化,这个设计极大的简化了设计过程)。
接下来,我们详细分析灯的两个类——Lamp和LampController。Lamp用枚举来定义,因为灯是固定的,不需要变化(单例思想)。private Lamp(String opposite,String next,boolean lighted)方法在设计时根据需要传递三个参数(分别对应当前灯的反方向的灯、当前灯的下一个灯,当前灯是否亮)。所以我们在以后的设计中可以参考这种思想——方法涉及到多个数据时,直接把数据设计成参数(一句废话),我觉得张老师设计的巧妙之处在于他把灯类简化(含有实际逻辑的就只有四个灯),而且把四个灯在定义枚举时就关联起来了。其他没有逻辑的灯在定义式就直接把相应的关联参数Null了,还有4条一直可以通过的灯常亮。这里还要说一点是Lamp.valueOf(opposite)方法,由于Lamp是枚举,在定义式Lamp(String opposite,String next,boolean lighted)的关联参数是String类型的,所以我们在调用String opposite对应的枚举时要用valueOf(String)来获得String对应的枚举。Lamp里定义的light()和blackOut()方法还是好理解的,注意返回值,一个是void一个是Lamp。再来看灯控制类,其实灯控制类核心部分是线程池和定时器而已,newScheduledThreadPool(int corePoolSize)是个静态方法,用来创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行,返回的是一个ScheduledExecutorService类。然后调用scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)方法作为执行定时器。
接下来我们再来看路类:路类是随机产生“车辆”,“车辆”产生后放入ArrayList<String>中(看成可变数组即可);随机产生“车辆”,张老师的办法是让线程控制产生 “车辆”,产生一个“车辆”后,等待随机秒,然后再产生“车辆”。每条路都有自己的控制线程,相关的线程池查阅API文档就知道了。要注意的是,张老师在execute()方法中使用的是匿名内部类,这个匿名内部类启动一个线程,被启动的线程是线程池pool提供的。路类还有需要完成的一个功能是判断灯的信号,然后将自己的“车辆”通过红绿灯。这里用到的是定时器,和前面介绍的等地定时器一样,理解了前面的这里也不难理解。
最好发点小感慨,之前编写的小程序都是一个类就能搞定,很少涉及到什么多个类啊包啊啥的,这是第一次接触系统的软件开发。理解是理解的差不多了,但是整个自己完全写出来估计还不行,加油吧.
---------------------- android培训、java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima