新写的总结。虽然在项目下也添加了,但为了查看清晰起见,就这里再发一贴。
总结:
首先把老师的一句比较经典的话写下来:谁拥有数据,谁有的提供操作这些数据的方式 !
问题解决:
交通灯看似一个比较复杂的问题,经过一步一步的细化分析,最终将题目分解为多个类,每个类设置不同的属性与动作。在这里最难设计的一个类是路灯类。一般人们不会去想到用枚举(一般人思维:枚举就是设置数据常量集合的)。其实不然,枚举也可以自己的构造函数,自己的方法,自己的属性。在这里用枚举来表示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),
如果出现这个问题:说明你没有看清老师前期的分组,首先需要控制的灯有8个,这8个灯分成四组。关键就在这四组上,四组中每组的成员中有两个,两个中有一个设置上自己的相对路灯即可。也可以这样理解,可以把每组的路灯一个叫做主灯,一个叫做次灯,主灯可以控制次灯(内部有次灯的引用)。
除此还有一个要点不知大家注意了没有:
S2N("N2S","S2W",false), S2W("N2E","E2W",false), E2W("W2E","E2S",false), E2S("W2N","S2N",false), //这四个形成一个循环
我后面注释上了:这四个形成一个循环。即这四个主灯内部通过设置下一个主灯,来实现循环。即每个灯构造函数第二个参数就是下一个主灯,四组形成一个循环。而相对的灯即次灯通过主灯来设置。
还要强调一点:这里是通过枚举类实现了数据的共享。枚举是静态final的,保证每次通过Lamp得到的等都是同一个灯 !这样就能保证操作的是同一个灯。。
自己面向对象的理解:
Lamp类:路灯,大家都知道每个路灯都有暗亮吧,再者根据“谁拥有数据,谁就得拥有操作这些数据的方式”。很明显每个灯都得有自己变亮,变暗的方式,自己也要知道自己是暗是亮。
LampControl,主要是启动路灯,并且用新的线程控制路灯的相互轮番暗亮,这里使用定时器来控制路灯。
Road类:每条路上都有很多车,有自己的路灯。这样我们可以得到路上要有车的集合,和路灯这两个成员变量。这里路灯是用了灯的名字代替的,用String代替操作起来也方便,只要能通过灯的名字 得到相应的灯即可。 路上面肯定是每隔一段时间都会有很多车来,很多车走。很显然要启动两个线程,分别增加和减少本条路上的车辆。