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

本文介绍了使用Java实现交通灯管理系统的思路和代码实现。通过枚举类型表示路灯,设计路灯控制器进行定时切换,并创建路对象管理车辆通行。系统中包含路灯的变灯逻辑和车辆的动态添加与通行控制。

先画出图以便于分析问题:


项目分析:

       用面向对象的方式思考:项目中出现的对象分别有:路灯、路灯控制器、路。因为项目的侧重点是路灯,所以就把路上行驶的车看做是路的一个属性,并且路会根据路灯确定是否让车子前进,路还有向自己增加车子的方法。

具体要写代码的思路:

1、路灯

 首先“路灯”因该是一个枚举类型,因为此项目中有12条不同的路,每条路上都要有一个路灯,所以路灯的实例因该只有12个。用面向对象的方式思考:谁拥有数据谁就应该提供操作这些数据的方法,则路灯因该有控制自己变红和变绿的方法,而且还要有向外部提供自己现在是红灯还是绿灯的方法。

2、路灯控制器

顾名思义,路灯控制器就因该控制路灯的变化,当new出一个路灯控制器的实例时它就因该不停的工作,所以它因该创建一个新线程,又因为路灯的变化是一个有规律的死循环,则考虑到用一个有频率的定时器来实现这个功能。

3、路

分析可知一共有12条不同的路线,所以路对象因该只创建12个不同的实例。路还因该有一个集合类,用来保存路上的车。路还因该有一个方法用来管理路上的车能否通过十字路口,路还因该有一个向自己添加车辆的方法。而且这两个方法都因该是一个单独的线程在运行,并且是在路创建的时候就开始运行了,所以在路的构造方法中因该创建了两个线程来执行这两个不同的方法。

下面是这个项目的代码实现:

1、路灯的代码:

[java]  view plain copy
  1. package com.hbsi.interview.traffic;  
  2.   
  3. public enum Lamp {  
  4.   
  5.     //因为路灯间是有逻辑关系的,所以只控制这四个灯,其他的灯就都能够确定是什么状态了  
  6.     S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",false),  
  7.     //这四个灯是由上面四个灯控制的  
  8.     N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),  
  9.     //这四个能比较特殊,一直是绿灯  
  10.     S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);  
  11.       
  12.     private  Boolean condition;  
  13.     private String next;  
  14.     private String equal;  
  15.       
  16.     private Lamp(String next,String equal,Boolean condition){  
  17.         this.next = next;  
  18.         this.equal = equal;  
  19.         this.condition  = condition;  
  20.     }  
  21.     public Boolean isLighted(){  
  22.         return condition;  
  23.     }  
  24.     //让灯变成绿灯的方法  
  25.     public void light(){  
  26.         condition = true;  
  27.           
  28.         if(equal!=null){  
  29.             Lamp equalLamp = Lamp.valueOf(equal);  
  30.             equalLamp.light();  
  31.             System.out.println(this+" Lamp is green,会有六个方向通车");  
  32.             System.out.println(equalLamp+" Lamp is green,会有六个方向通车");  
  33.         }  
  34.     }  
  35.     //让灯变成红灯的方法  
  36.     public Lamp blackOut(){  
  37.         this.condition = false;  
  38.         Lamp nextLamp = null;  
  39.         if(equal!=null){  
  40.             Lamp.valueOf(equal).blackOut();  
  41.         }  
  42.         if(next != null){  
  43.             nextLamp = Lamp.valueOf(next);  
  44.             nextLamp.light();  
  45.         }  
  46.           
  47.         return nextLamp;  
  48.           
  49.     }  
  50.       
  51.       
  52. }  

2、路灯控制器的代码:

[java]  view plain copy
  1. package com.hbsi.interview.traffic;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.ScheduledExecutorService;  
  5. import java.util.concurrent.TimeUnit;  
  6.   
  7. public class LampController {  
  8.     private Lamp currentLamp;  
  9.     //灯的控制器其实就是一个定时器,他会根据逻辑判断哪个路上现在因该是绿灯,这个绿灯要亮多久  
  10.     public LampController(){  
  11.         currentLamp = Lamp.S2N;  
  12.         currentLamp.light();  
  13.         Boolean roadLamp = Lamp.valueOf("S2N").isLighted();  
  14.         ScheduledExecutorService tmer = Executors.newScheduledThreadPool(1);  
  15.         tmer.scheduleAtFixedRate(  
  16.                 new Runnable(){  
  17.                     @Override  
  18.                     public void run() {  
  19.                         currentLamp = currentLamp.blackOut();  
  20.                     }  
  21.                 },  
  22.                 10,   
  23.                 10,   
  24.                 TimeUnit.SECONDS);  
  25.     }  
  26. }  
3、路的代码:

[java]  view plain copy
  1. package com.hbsi.interview.traffic;  
  2.   
  3. import java.util.*;  
  4. import java.util.concurrent.ExecutorService;  
  5. import java.util.concurrent.Executors;  
  6. import java.util.concurrent.ScheduledExecutorService;  
  7. import java.util.concurrent.TimeUnit;  
  8.   
  9. public class Road {  
  10.     private String name;  
  11.     private List<String> interview = new ArrayList<String>();  
  12.       
  13.     public Road( String name){  
  14.         this.name = name;  
  15.         //在创建Road的同时,向路上添加车  
  16.         ExecutorService pool= Executors.newSingleThreadExecutor();  
  17.         pool.execute(new Runnable(){  
  18.             @Override  
  19.             public void run(){  
  20.                 for(int i=1;i<1000;i++){  
  21.                     try {  
  22.                         Thread.sleep((new Random().nextInt(10)+1)*1000);//路添加车辆的速率会有所不同  
  23.                     } catch (InterruptedException e) {  
  24.                         e.printStackTrace();  
  25.                     }  
  26.                     interview.add(Road.this.name+"_"+i);  
  27.                     //System.out.println(Road.this.name+"添加第"+i+"辆车");  
  28.                 }  
  29.             }  
  30.         });  
  31.         //路创建后因该不断的判断自己路上的车能不能通过路口  
  32.         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);  
  33.         timer.scheduleAtFixedRate(  
  34.                 new Runnable(){  
  35.                     @Override  
  36.                     public void run(){  
  37.                         if(interview.size()!=0){  
  38.                             Boolean roadLamp = Lamp.valueOf(Road.this.name).isLighted();  
  39.                             if(roadLamp){  
  40.                                 System.out.println( interview.remove(0));  
  41.                             }  
  42.                         }  
  43.                     }  
  44.                 },   
  45.                 1,   
  46.                 1,   
  47.                 TimeUnit.SECONDS);  
  48.     }  
  49.       
  50. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值