黑马程序员_交通灯管理系统

---------------------- android培训、java培训、期待与您交流! ----------------------

【交通灯管理系统的项目需求】

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
》异步随机生成按照各个路线行驶的车辆。
  例如:
  由南向而来去往北向的车辆。。。直行车辆
由西向而来去往南向的车辆。。。右转车辆
由东向而来去往南向的车辆。。。左转车辆
。。。
//想不明白时最好画个图,看着更明了;视频中提及到native2ascii,google后发现是个国际化软件时解决字符编码问题的软件;DOM4J是一种解析XML 文档的开放源代码XML 框架;
//总共有12条路线,为了统一编程模型,可以假设每条路线上都有一个红绿灯对其进行控制,右转弯的4条路线的控制状态可以假设为常绿,剩下8条路线,两两成对,最后简化为四条路线:S2N,S2W,E2W,E2S(即南向直行,左转;东向直行,左转)
》信号灯忽略黄灯,只考虑红灯和绿灯
》应考虑左转车辆控制信号灯,右转不考虑;
》具体信号灯逻辑与现实生活相同,不考虑特殊情况;
注:南北向车辆与东西向交替放行;同方向先直行后拐弯。(以前还真没注意过——!)
【面向对象的分析与设计】
》首先初步设想有哪些对象:红绿灯,控制红绿灯的系统,汽车,路线。
》汽车不是看到自己所在路线为绿灯就穿过,还有看前方是否有车,这就要问路线;路中存储车辆的集合,所以路就该有增加车辆和减少车辆的方法;再看题目,我们并需要车辆移动的过程,只要知道一辆车过了路口就行,所以车并不需要设计为一个对象,用一个字符串表示就行了。
》面向对象的编程经验,谁拥有数据,谁就对外提供操作这些数据的方法;
》两个面向对象的面试题,用面向对象能够的方式设计如下情景:
1."两个石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子"
2."球从一根绳子的一端移动到另一端"
【交通灯】
》设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红);每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态;
》总共有12条录像,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑;
》除了有拐弯的其他8条路线的等,它们是两两成对的,可以归为4组,所以,编程处理时,从这4组中个取出一只灯,对这4个灯依次变亮,与之对应的灯也随之变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的亮黑方法中也处理对应的灯。每个灯变黑时,也意味着亮一个灯,所以还有下一个变量来记住自己的下一个灯。
【控制器】
》属性:当前亮的灯是哪一个;定时器;currentlamp=currentlamp.blackout();即使当前灯变黑,也同时返回下一个亮的灯;
【Road类的编写】
建一个线程池,而不是在构造方法中sleep,将任务交给线程池,线程池会自己选择一个线程去执行;ExecutorService是线程池;
未用过的类、接口:ExcutorService pool=Executors.newSingleThreadExecutor();pool.execute(new Runnable());ScheduleExecutorService timer =Executors.newScheduledThreadPool(1)//只有一个线程的线程调度池;timer.scheduleAtFixedRate(new Runnable(),delay//任务延迟多久做,period//间隔多长时间再做一次,Unit//指定前面两个数据的单位);
复习的点:(new.Random().nextInt(10)+1)返回1到10的伪随机数;内部类调用外部类成员变量:Road.this.name;Vehicles.remove(0)//vehicle是个arraylist的实例,remove去掉索引为0的对象,并且将这个对象返回;
【灯】
使用枚举类会大幅度提高效率;
每个灯的构造方法传递三个参数,灯是否亮(true or false),下一个灯,成组的那个灯;
技巧:枚举类时将12个灯排成三行,第一行按照下一个轮换排好,第二行按照成组的灯与第一行排好,第三行常绿的灯;这样不容易乱,思路清晰;
注意,构造方法时直接传递枚举类会报错,所以用string名字替代的方法,在使用lamp.valueof(string)的方法转化回来就行了;light方法点亮对面的灯时,要判断,不然会死循环;
【LampController】
为了让timer.scheduleAtFixedRate(command,delay,period,unit)看起来更清晰,将四个参数分成四行来写;
【张老师调试过程】
Lamp nextLamp=Lamp.valueOf(next);
if(next!=null){
System.out.println("...");
nextLamp.light();
}
return nextLamp;
修改为:
Lamp nextLamp= null;
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("...");
nextLamp.light();
}
return nextLamp;
每次有六个方向上的车辆通过,分别是绿灯通行的方向和四个右转弯的方向;
【题外话】

张老师讲为什么来班上之前好多人只想3000就不错了,但是后来连六千五都看不上了,就是因为环境;一个人在国企里跟人打麻将,那么你也就每天打麻将;在IT编程环境中,编程也才能好;

---------------------- android培训、java培训、期待与您交流! ----------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值