码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员-JAVA学习之交通灯管理系统分析与实现

时间:2014-09-10 14:02:30      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   http   color   os   io   java   ar   

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

交通灯管理系统:

需求:
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1. 异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 右转车辆
由东向而来去往南向的车辆 枚举来实现.枚举是一种特殊的(类).因为既有方法,字段,也有构造方法
代码实现如下:

//
package com.fylx.test;
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 String opposite;
    private String nextlamp;
    private boolean isGreen;

    // 返回一个灯是否是绿色的属性
    public boolean isGrean()
    {
        return this.isGreen;
    }

    // 每个信号灯的对头灯,下一个要变绿的灯,这个灯是否绿色的
    Lamp(String opposite, String nextlamp, boolean isGreen)
    {
        this.opposite = opposite;
        this.nextlamp = nextlamp;
        this.isGreen = isGreen;
    }

    // 变绿的方法,如果有对头灯,对头灯的状态也要变绿
    public void turnGrean()
    {
        this.isGreen = true;
        System.out.println(this.name() + "方向的灯变绿了!");
        if (this.opposite != null)
        {
            Lamp.valueOf(this.opposite).turnGrean();
        }
    }

    // 变红的方法,如果有下一个对应的灯,则下一个灯要就绿,同时返回下一个灯
    public Lamp turnRed()
    {
        this.isGreen = false;
        System.out.println(this.name() + "方向的灯变红了!");
        if (this.opposite != null)
        {
            Lamp.valueOf(this.opposite).turnRed();
        }
        Lamp next = null;
        if (this.nextlamp != null)
        {
            next = Lamp.valueOf(this.nextlamp);
            Lamp.valueOf(this.nextlamp).turnGrean();
        }
        return next;
    }
}
//

 

下面我们我分析信号灯的控制器,由需求可以看出,控制器就是控制信号灯的交换时间的,只要弄一个定时器,在规定的时间和时间间隔内不断的让信号灯有条理的亮起来了变换就可以了
而且从上面的信号灯中我们可以看出,信号灯在变换的时候,会自动的触发其对应的对面的信号灯和左拐灯的变化,所以,在控制器中,我们只要控制一个灯的变红变绿就可以了,
代码实现如下:

//
package com.fylx.test;
import java.util.concurrent.*;
public class Controller
{
    //控制器当前要控制的信号灯
    private Lamp currentLamp;

    public Controller()
    {
        this.currentLamp = Lamp.S2N;
    }

    // 启用信号灯控制器,5秒后执行,并每过10秒变换信号灯的颜色
    public void on()
    {
        this.currentLamp.turnGrean();

        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(new Runnable()
        {
            public void run()
            {
                currentLamp = Controller.this.currentLamp.turnRed();
            }
        }, 5, 10, TimeUnit.SECONDS);
    }
}
//

路线类的分析,由需求可知,路线类只管按信号灯的变化走车,车的增加和出现是异步随机生成的.且每辆车通过路口的时候都为1秒,能不能走车就看对应的信号灯是不是绿灯,而且路线的功能
与信号灯控制器没有关联,而于之关联的是信号灯,由于我们的信号灯是用枚举实现的,所以路线类直接保存信号灯的名称就可以了,由于路线上有车,所以路线这个类中也要添加相关车的代码
代码实现如下:

//
package com.fylx.test;
import java.util.*;
import java.util.concurrent.*;

public class Route
{
    // 定义一个交通工具
    private List<String> vechicles = new ArrayList<String>();
    // 线路的名称,要求和信号灯的名称对应
    private String name;
    // 随机算算器
    Random random = new Random();

    public Route(String name)
    {
        this.name = name;
        // 启动一个线程池,异步随机的生产交通工具
        ExecutorService service = Executors.newSingleThreadExecutor();
        service.execute(new Runnable()
        {
            public void run()
            {
                for (int i = 1; i < 1000; i++)
                {
                    try
                    {
                        Thread.sleep((random.nextInt(10) + 1) * 1000);
                    } catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    Route.this.vechicles.add(Route.this.name + "_" + i);
                }
            }
        });
        // 定义定时器,在1秒后执行,并且每1秒过一辆车
        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(new Runnable()
        {
            public void run()
            {
                if (vechicles.size() > 0)
                {
                    Lamp lamp = Lamp.valueOf(Route.this.name);
                    if (lamp.isGrean())
                    {
                        System.out.println(vechicles.remove(0) + "安全通过了!");
                    }
                }
            }
        }, 1, 1, TimeUnit.SECONDS);

    }
}
//

现在我们来模拟一个测试环境,在这个环境中,有路线,有信号灯控制器,因为信号灯是枚举,不用在这里实例化,直接在控制器里面关联一个信号灯就可以了.
测试代码如下:

//
package com.fylx.test;
public class Test
{
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        String[] lamps = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S", "N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };

        for (String lamp : lamps)
        {
            // 根据信号灯,实例化对应的线路
            new Route(lamp);
        }
        // 生产一个信号灯控制器,并同时启用
        new Controller().on();
    }
}
//

在这个系统的设计过程中,难的并不是代码实现,而是业务分析,如果业务逻辑分析清楚了,代码实现也就好写了.

 

黑马程序员-JAVA学习之交通灯管理系统分析与实现

标签:android   style   blog   http   color   os   io   java   ar   

原文地址:http://www.cnblogs.com/fylx/p/3964263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!