IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> Java -> 黑马程序员——【Java高新技术】——案例:交通灯管理系统 -> 正文阅读

[Java]黑马程序员——【Java高新技术】——案例:交通灯管理系统

黑马程序员——【Java高新技术】——案例:交通灯管理系统 ---------- android培训、java培训、期待与您交流! ---------- 
一、交通灯管理系统的项目需求
  Ø 异步随机生成按照各个路线行驶的车辆
   例如:
   由南向而来去往北向的车辆 ---- 直行车辆
   由西向而来去往南向的车辆 ---- 右转车辆
   由东向而来去往南向的车辆 ---- 左转车辆
   ……
  Ø 信号灯忽略黄灯,只考虑红灯和绿灯。
  Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
  Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
   注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆,而后放行左转车辆。
  Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
  Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
  Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
二、交通(灯)运行示意图
   

   线路图分析:图中总计有12条路线,为统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,(N2E、N2W、W2S、S2E)右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
三、面向对象的分析与设计
  面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。
  1、每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。
  Ø 设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
  Ø 每条路线上随机增加新的车辆,增加到一个集合中保存。
  Ø 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
  Ø 每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
  2、设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮或黑状态。
  Ø 总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
  Ø 除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。
  Ø 无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。
  Ø 设计一个LampController类,它定时让当前的绿灯变红。 
四、代码实现
  (一)Road类的代码 

 1 package com.isoftstone.interview.traffic;
 2 import java.util.ArrayList;
 3 import java.util.List;
 4 import java.util.Random;
 5 import java.util.concurrent.ExecutorService;
 6 import java.util.concurrent.Executors;
 7 import java.util.concurrent.ScheduledExecutorService;
 8 import java.util.concurrent.TimeUnit;
 9 public class Road {
10     private List<String> vehicles = new ArrayList<String>();    
11     private String name = null;// 给每条路定义一个名字    
12     public Road(String name){
13         this.name = name;
14         //定义一个线程池,挑出一个线程去执行run()方法中的代码,run()中的代码用于每隔10秒,路上增加一辆车。
15         ExecutorService pool = Executors.newSingleThreadExecutor();
16         pool.execute(new Runnable(){
17             public void run(){
18                 for(int i=1;i<1000;i++){
19                     try {
20                         Thread.sleep((new Random().nextInt(10)+1)*1000);
21                     } catch (InterruptedException e) {
22                         e.printStackTrace();
23                     }
24                     vehicles.add(Road.this.name+"_"+i);
25                 }
26             }
27         });
28         
29         //定义一个定时器:用Executors.newScheduledThreadPool()函数,创建线程池,其返回值类型是ScheduleExecutorService。
30         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
31         timer.scheduleAtFixedRate(
32                 new Runnable(){
33                     public void run(){
34                         if(vehicles.size()>0){
35                             boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
36                             if(lighted)
37                                 System.out.println(vehicles.remove(0)+" is travelling! ");
38                         }
39                     }
40                 },
41                 1,
42                 1,
43                 TimeUnit.SECONDS);
44     }
45 }

  (二)Lamp类的代码

 1 package com.isoftstone.interview.traffic;
 2 public enum Lamp {
 3     S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
 4     N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
 5     S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
 6     
 7     private Lamp(String opposite,String next,boolean lighted){
 8         this.opposite = opposite;
 9         this.next = next;
10         this.lighted = lighted;
11     }
12     private Lamp(){
13     }
14     
15     private boolean lighted;
16     private String opposite;
17     private String next;
18     
19     public boolean isLighted(){
20         return lighted;
21     }
22     
23     public void light(){
24         this.lighted = true;
25         if(opposite!=null){
26             Lamp.valueOf(opposite).light();
27         }
28         // Enum的 name()方法, 返回此枚举常量的名称,在其枚举声明中对其进行声明。返回值类型是String。
29         System.out.println(name()+" lamp is green, 下面总共应该有6个方向能看到汽车穿过。");
30     }
31     
32     public Lamp blackOut(){
33         this.lighted = false;
34         //假如有对面的灯,将对面的灯变黑;
35         if(opposite!=null){
36             Lamp.valueOf(opposite).blackOut();
37         }
38         //假如有下一个灯,就让下一个灯变绿;
39         Lamp nextLamp = null;;
40         if(next!= null){
41             nextLamp =Lamp.valueOf(next);
42             System.out.println("绿灯从"+name()+"--------->切换为"+next);
43             nextLamp.light();
44         }
45         return nextLamp;
46     }
47 }

  (三)LampController类的代码

 1 package com.isoftstone.interview.traffic;
 2 import java.util.concurrent.Executors;
 3 import java.util.concurrent.ScheduledExecutorService;
 4 import java.util.concurrent.TimeUnit;
 5 public class LampController {
 6     private Lamp currentLamp;
 7     public LampController(){
 8         //刚开始让由南向北的灯变绿;
 9         currentLamp = Lamp.S2N;
10         currentLamp.light();
11         
12         /*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
13         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
14         timer.scheduleAtFixedRate(
15                 new Runnable(){
16                     @Override
17                     public void run() {
18                         System.out.println("");
19                         currentLamp = currentLamp.blackOut();
20                     }
21                 },
22                 10,
23                 10,
24                 TimeUnit.SECONDS);
25     }
26 }

  (四)MainClass类的代码

 1 package com.isoftstone.interview.traffic;
 2 public class MainClass {
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         /*产生12个方向的路线*/
 8         String [] directions = new String[]{                "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"    
 9         };
10         for(int i=0;i<directions.length;i++){
11             new Road(directions[i]);
12         }
13         /*产生整个交通灯系统*/
14         new LampController();
15     }
16 }

---------- android培训、java培训、期待与您交流! ----------
上一篇文章      下一篇文章      查看所有文章
加:2015-03-30 00:39:22  更:2017-05-14 23:55:20 
 
  Java 最新文章
初入山门,需记门规
java 操作本地数据库 mysql
spring boot 整合 mybatis
单表(SSM、SpringBoot、SpringCloud、Free
Mybatis框架中Mapper动态代理方式
IDEA报错:Error starting ApplicationCont
JDK源码之String、StringBuffer、StringBui
java 初始化与清理
Java 对象初始化
第四天知识点
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年12日历
2018-12-17 16:34:03
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库