黑马程序员——交通灯管理系统的学习与分析
来源:互联网 发布:淘宝自动好评加分吗 编辑:程序博客网 时间:2024/06/03 06:43
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
交通灯管理系统的学习与分析
针对这个题目,最重要的是对题目进行分析,首先,我们应该从我们最熟悉的路口进行入手,并画一张示意图进行描述,示意图如下:
由上图可知,在一个十字路口,一共有12条线路可以同行。
同时,为了方便起见,做出以下设定:
1. 忽略黄灯(黄灯只是在绿灯变红灯的时候加入几秒钟,去除不影响该系统的整体实现效果)。
2. 因为车辆始终可以向右转弯,所以右转路线的交通灯始终为绿灯,这样统一划定,便于编程实现。
该系统所设定的对象:红绿灯、红绿灯控制器、汽车、路。
对车辆进行分析
汽车通过路口的条件:1.绿灯亮。2.前面没有车。
对路进行分析
路中存有车辆的集合,同时也应有增加和删除车辆的方法。
面向程序设计的重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。
因为有12种路线,所以应有12个实例对象,此处使用枚举,更加方便。
对灯进行分析
除去向右转弯的4个灯共有8个灯,在这8个灯中,相对的灯点亮情况相同,即灯又是成对出现,所以只需要分析4组就可以了。此处分析S2N,S2W,E2W,E2S四个方向上的灯。
灯必须保存3个信息:1.绿灯是否点亮。2. 相对灯的信息。3. 下一个灯的信息。
加入是右转方向的灯,则不需要这3个信息。
编码阶段
对 “路”的定义
判断灯的点亮情况,并且获取车辆和释放车辆。package com.itheima.traffic;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Road {private List<String> vechicles = new ArrayList<String>();private String name = null;public Road(String name){this.name = name;ExecutorService pool = Executors.newSingleThreadScheduledExecutor();pool.execute(new Runnable(){public void run(){for(int i = 1; i < 1000;i++){try {Thread.sleep((new Random().nextInt(10) + 1) * 1000);} catch (InterruptedException e) {e.printStackTrace();}vechicles.add(Road.this.name + "_" + i );}}});ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){if(vechicles.size() > 0){boolean lighted = Lamp.valueOf(Road.this.name).isLighted();if(lighted){System.out.println(vechicles.remove(0) + "is traversing!");}}}},1,1,TimeUnit.SECONDS);}}
对“灯”的定义
使用枚举列出12条道路上灯的点亮情况,并设置方法,当一个方向上绿灯点亮,则对应的一侧绿灯也会点亮。当一个方向绿灯熄灭,则对应的一侧的绿灯也熄灭,同时控制下一组绿灯点亮。
package com.itheima.traffic;public enum 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),S2E(null, null, true), E2N(null, null, true), N2W(null, null, true), W2S(null, null, true);private Lamp(String opposite, String next, boolean lighted){this.opposite = opposite;this.next = next;this.lighted = lighted;}private Lamp(){}private boolean lighted;private String opposite;private String next;public boolean isLighted(){return lighted;}public void light(){this.lighted = true;if(opposite != null){Lamp.valueOf(opposite).light();}System.out.println(name() + "lamp is green, 下面总共应有6个方向上能看到汽车穿过!");}public Lamp blackOut(){this.lighted = false;if(opposite != null){Lamp.valueOf(opposite).blackOut();}Lamp nextLamp = null;if(next != null){nextLamp = Lamp.valueOf(next);System.out.println("绿灯从" + name() + "------------>切换为" + next); nextLamp.light();}return nextLamp;}}
对控制器的定义
对路灯进行定时点亮和熄灭。
package com.itheima.traffic;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampController {private Lamp currentLamp;public LampController(){currentLamp = Lamp.S2N;currentLamp.light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){currentLamp = currentLamp.blackOut();}}, 10,10,TimeUnit.SECONDS);}}
主函数:
package com.itheima.traffic;public class MainClass {/** * @param args */ public static void main(String[] args) {String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for(int i = 0; i < directions.length; i++){new Road(directions[i]);}new LampController();}}
- 黑马程序员——交通灯管理系统的学习与分析
- 黑马程序员——学习交通灯管理系统的启发
- 黑马程序员——交通灯管理系统的学习
- 黑马程序员 交通灯管理系统的分析与理解
- 黑马程序员 交通灯管理系统的学习
- 黑马程序员学习笔记九——交通灯管理系统
- 黑马程序员——交通灯管理系统学习笔记
- 黑马程序员——交通灯管理系统学习笔记
- 黑马程序员——交通灯管理系统学习总结
- 黑马程序员 JAVA学习笔记——交通灯管理系统
- 黑马程序员——学习日记23 交通灯管理系统
- 黑马程序员 java学习笔记——交通灯管理系统
- 黑马程序员--【学习日记十】——交通灯管理系统
- 黑马程序员_java学习笔记14—交通灯管理系统
- 黑马程序员——交通灯管理系统
- 黑马程序员——交通灯管理系统
- 黑马程序员——交通灯管理系统
- 黑马程序员——交通灯管理系统
- HTML网页Javascript跳转代码
- 【JavaScript】Ext JS - 高效的编码风格指南
- Monkey测试3——Monkey测试结果分析
- DB2常用函数详解(二):类型转换函数
- MySQL Order By索引优化
- 黑马程序员——交通灯管理系统的学习与分析
- HDU 2044 一只小蜜蜂…【递推】
- MyEclipse中ZK项目运行时候tomcat的报错
- 数组
- linux使用find命令找到文件所有者不是root的方法
- 每天复习面试题
- Asp.net中使用mediaplayer,百度影音,快播播放音乐,电影
- Uicc之UiccCard(原)
- 安卓开发者必备的42个链接