黑马程序员——交通灯管理系统的学习与分析

来源:互联网 发布:淘宝自动好评加分吗 编辑:程序博客网 时间: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();}}


0 0