黑马程序员——Java学习笔记之⑨——“交通灯管理系统”


----------- 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培训、期待与您交流! ------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值