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

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

简单分析

1.要想模拟交通灯管理系统 起码得有车 有灯有路   

2.我们可以这么做 生成车辆放在路上根据灯的状态 判断车是否还停留在这条路上

3.灯要怎么处理  其实就是给他一个初始状态 再弄个定时器 让灯不断变化就行

4.实体有两个路与灯

进一步分析

1.路类

------路类 要做两件事 就是生成汽车 有消除汽车 (其实就是汽车的增删) 其实就是路类中保存一个字符串数组  用于表示所有这条路上的汽车

-------路类中有个2个变量 一个是字符数组 一个是字符串 字符串是因为有12条路 你要怎么表示呢 用字符串表示到底是那条路

------路要做的是根据灯的状态 来执行车辆的增删

2.灯类(我们要做到的是灯不断的自动变换  要求是相对的灯的状态一样 相邻的灯状态不一样)

要想做到不断自动变换就要用到一个定时器  所以出现了灯的控制器   每10秒灯就变换一次

-----要想做到(生成车辆放在路上根据灯的状态 判断车是否还停留在这条路上)就要有判断灯是否是绿的这样的方法

-----有灯就有红绿  如果我变成了绿灯那么与我相对的也要变成绿灯 如果我变红灯 那么与我相对的也是红灯 但相邻的却是绿灯

-----所以灯类中有3个变量  灯的状态lighted  相对的灯opposite 下一个灯也就是相邻的灯next

-----还有 怎么表示下一个方向和相对方向呢  这时候就用的了枚举 只有12个实例 并给实例赋初值  S2N("N2S", "S2W", false) 参数表示相对的相邻的 是否绿灯

3.测试类主类

----要做的是1.生成12条路 (模拟一个十字路口)2.调用灯的控制器 让灯不断变换

-----这样就做到了12条路不断产生车辆 又根据的灯的状态不断的消除车辆(路类做的事)

-----灯是怎么不断变换的呢  付一个初始值比如s2n灯亮着 过10秒后调用灯灭的方法 而灯灭的方法返回的是此灯的下一个灯 

 过10再调用下一个灯的灯灭方法 这样就可以循环下去了


源代码

路类

public class Road {

    //数组保存车辆 字符串表示路名
    List<String> vechicies = new ArrayList<String>();
    private String name = null;

    public Road(String name) {
        this.name = name;
//定义线程不断生成车辆 放到数组中
        ExecutorService pool = Executors.newSingleThreadExecutor();
        pool.execute(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 1000; i++) {
                    try {
                        Thread.sleep((new Random().nextInt(10) + 1) * 1000);
                        vechicies.add(Road.this.name + "_" + i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

            }
        });
//根据车的状态把车从数组中去掉
        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                if (vechicies.size() > 0) {
                    boolean lighted =Lamp.valueOf(Road.this.name).isLighted();
                    if(lighted){
                        System.out.println(vechicies.remove(0)+" is traversing! ");
                    }

                }

            }
        }, 1, 1, TimeUnit.SECONDS);

    }

}
灯枚举类
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() {
    }
//灯的3变量  状态 相对灯与相邻的灯
    private boolean lighted;
    private String opposite;
    private String next;

    //判断灯状态
    public boolean isLighted() {
        return lighted;
    }
//把灯变绿
    public void light() {
        this.lighted = true;
        if (opposite != null){
            Lamp lampOpposite = Lamp.valueOf(opposite);
            lampOpposite.light();
        }
        System.out.println(name()+" 灯变绿了");

    }
//把灯变红
    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;

    }

}
灯的控制器

public class LampController {
//保存灯实例
    private Lamp currentLamp;
//赋初值
    public LampController() {
        currentLamp = Lamp.S2N;
        currentLamp.light();
//定时器 每10秒调用一次 由亮变成灭的方法
        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                System.out.println("来啊");
                currentLamp = currentLamp.blackOut();
            }
        }, 10, 10, TimeUnit.SECONDS);

    }

}

测试类

public class MainClass {
    
    public static void main(String[] args) {
       //生成12条路
        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();
        
        
      
    }
    

}

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值