----------- android培训、java培训、期待与您交流! ------------
1、面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。
示例①:人在黑板上画圆
分析:画圆这个功能是圆所具有的特有功能,即“圆”拥有“画圆”这个功能。
示例②:列车司机紧急刹车
分析:刹车时列车的功能,司机要刹车的话只是对车下达一定的信号,比如踩刹车。司机刹车时不用关心列车是怎么刹车的,只需要使用列车的刹车功能就行。
示例③:人把门关上
分析:关门这个动作是门所具有的功能,人只是推了门一把,具体门怎么绕着门轴关上的这种关门动作,是由门自己实现的。
示例④:用面向对象的方式设计“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”这样的情景
分析:石头做成石刀后,石头会消失,所以肯定不能把石头作为数据的拥有者,对外提供操作方法。而石头变成了石刀,则想到用工厂加工事物的例子,即建立石刀加工厂,工厂得到石头,加工出石刀,即“StoneKnife = KnifeFactory.createKnife(Stone)”。然后,石刀有砍树功能,得到了木材,可以设计为“wood = StoneKnife.cut(tree)”,最后木材做成椅子,同理可以设计为“chair = ChairFactory.makechair(wood)”。
示例⑤:用面向对象的方式设计“小球从绳子的一段移动到另一端”这样的情景
分析:具体对象有两个:小球和绳子。小球有移动功能,而具体怎么移动,则要看绳子(沿着绳子的方向移动),所以要定义一个绳子对象,并明确它的方向,好让小球按照绳子的方向移动。模拟代码如下:
2、需求说明:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
3、需求分析:
①首先按照需求说明,画图(这里借鉴张孝祥老师的图啦 嘿嘿)。
②观察行车路线图可知,一共有12条行车路线。从日常生活常识得到了这样一个规律:当有车从南往北穿行时,同时和它相对的从北往南的行车路线上也可以有车穿行。同理,可一共得到4对相对路线:从南往北<-->从北往南,从南往西<-->从北往东,从东往南<-->从西往北,从东往西<-->从西往东。这里因为右转车辆是不受交通灯限制的,所以不在考虑范围之内。
③经过分析,我们想到,可以为这12条路线的每条路线上安装一个交通灯,来控制车流。而经过②中的分析,只要按顺序切换上述四组路线中的每组的任意一条路线的交通灯(相对应路线上的灯随着对应它的路线上的交通灯的改变而改变)即可完成全部的管控工作。对于右转的车辆,可以将其交通灯一直设置为绿灯,来模拟这四条路线上的车流不受管控的情况。
④基本逻辑梳理清晰后,接下来进行具体对象的属性和功能设计。
首先,每条路线上车辆的增加是随机的,不受交通灯状态的影响,即每隔一个随机的时间,路上就增加一辆车。
其次,车辆的减少是根据这条路线上交通灯的状态来决定的。如果为绿灯,每秒减少一辆车,代表该辆车穿过了十字路口)。
再次,每条路线每隔一秒都要检查该路线所对应的交通灯的状态,如果为绿灯继续减少车辆,如果为红灯,则停止减少车辆。
最后,经过上述分析,我们只需要控制四组灯的变化,就可以完成整个12条路线的车流管理工作,所以,最好的情况是让这四组灯都有轮流变为绿灯的机会,即可以自定义这四组等轮流变绿灯的顺序,所以定义灯的属性时,不仅要定义每个灯随着这个灯的变化而变化的那个灯,还要设置这个灯变红灯后下一个要变绿灯的那个灯,最后还要设置一个属性用来标识该交通灯是否处于绿灯状态,方便该路线上的车流管控。
4、设计思路与代码实现:
①定义路线Road的属性及其功能:
②定义交通灯
③定义交通灯管理器,用来统一管理12条路线上对应的交通灯的状态变化。
④建立主类,创建12条路线,并启动交通灯管理器开始调度路线上的车流。
总结:
1、在这个题目中,接触到了新的线程建立的方法,相当的高效。
2,、其次,我认为,这个代码中还有一些可以琢磨的细节,比如代码中变量的标识符以及方法名起的不利于阅读,比如,交通灯的状态就绿灯跟红灯两种,虽然灯的状态标识符可以为boolean,但是标识符可以设计为:isGreen; 灯变绿,可以设计为:Red2Green;灯变红可以设计为:Green2Red;灯的变绿变红,用lighted,blackOut来标识,明显有一定的阅读障碍;等等还有一些地方可以根据题目中的需求起相应的变量名,这样更有利于阅读和后期的代码完善。
3、还有定义Road类时,感觉用LinkedList集合好一些,一方面,LinkedList集合增删元素比ArrayList集合快速高效,另一方面,LinkedList集合的元素增删更贴近于实际情况,例如:车开到某条路上,总是排在了末尾;车离开路上,总是从车队的队首开出。显然这是个先进先出的队列,所以用LinkedList集合要好一些。
4、还有,个人觉得这个题目中的交通灯控制器应该设计成单例,因为交通灯管理器只应该有一个。
5、最后,我也感觉我从这个题目中获益匪浅,尤其是只看书根本看不到的解决问题的思维和编程思想。
----------- android培训、java培训、期待与您交流! ------------