【黑马程序员】交通灯管理系统
来源:互联网 发布:画房间平面图软件 编辑:程序博客网 时间:2024/06/06 21:35
--------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ------
1. 交通灯管理系统的项目需求:
(1) 异步随机生成按照各个路线行驶的车辆。
(2) 信号灯忽略黄灯,只考虑红灯和绿灯。
(3) 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
(4) 具体信号灯控制逻辑与现实相同:南北方向车辆与东西方向车辆交替
放行,同方向车辆应该先放行直行车辆而后放行左转车辆。
(5) 每辆车通过路口时间为1秒(可通过Sleep的方式模拟)
(6) 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
(7) 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
2.交通灯控制逻辑分析:
(1)4个路口,每个路口有直走,左转,右转3个方向。其中现实中右转不受灯控制为了统一各个方向的特征,
假设右转有1个常绿的灯。
(2)每种车辆运动方式对应一个灯,就有12个灯,考虑到对称性,只需考虑4个灯,再除去常绿的灯,只需写3个灯的控制代码。
3.车辆运动逻辑分析:
(1)车辆运动受自己运动方向的交通灯控制
(2)车辆通过路口要考虑自己前方路口是否有车
4.面向对象设计原则:
(1) 谁拥有数据,谁就应该对外提供操作数据的方法,
(2)一个对象变成另一个对象,改方法不能放在对象本身,如stone->knife :Knife k=KnifeFactory.careakKnife(Stones1,Stones2)
5.面向对象分析:
(1)当车辆要了解自己前方是否有车,应该从某处获得该信息。因为车辆都在路上,路在程序中可视为一个集合,车辆就是其中的元素。所以路应该有增加,减少和查询的方法。
(2)路随机生成车辆,并根据等的状态决定其是否通过。
(2)每隔一定时间改变灯的状态,要有一个交通灯控制器。
(2)在这个项目中,不需要体现车辆移动的过程,只需捕捉车辆穿过路口的过程,只要过了路口,这车就不需要考虑了。所以车不需要单独设计成一个对象,用一个字符串表示就可以了。
(3)不管多少辆车,灯都是固定的12个,每个灯在2个状态间切换,所以可以用枚举来表示交通灯,每个元素表示灯控制的一个方向。
7.程序实现:
(1)Lamp枚举,记录交通灯状态,定义交通灯枚举元素间的变化关系
enum Lamp{ S2N("N2S",false,"S2W"),S2W("N2E",false,"W2E"),S2E("N2W",true,"S2E"), W2E("E2W",false,"W2N"),W2N("E2S",false,"S2N"),W2S("E2N",true,"W2S"), N2S(null,false,null),N2E(null,false,null),N2W(null,false,null), E2W(null,false,null),E2S(null,false,null),E2N(null,false,null); private String opposite; private boolean lighted; private String next; private Lamp(String opposite,Boolean lighted,String next){this.opposite=opposite;this.lighted=lighted;this.next=next; } public void light(){this.lighted=true;if(opposite!=null){ Lamp LampOpposite=Lamp.valueOf(opposite); LampOpposite.light(); } System.out.println(name()+"lamp is green,下面总共应该6个方向能看到车辆穿过!"); } public Lamp blackOut(){this.lighted=false;if(opposite!=null){ Lamp lampOpposite=Lamp.valueOf(opposite); lampOpposite.blackOut();}Lamp nextLamp=null;if(next!=null){ nextLamp=Lamp.valueOf(next); System.out.println("绿灯从"+name()+"------->切换为"+nextLamp.name()); nextLamp.light(); }return nextLamp; } public boolean isLighted(){ return this.lighted; }}
(2)LampController 交通灯控制器类:控制交通灯随时间变化
package com.isoftsone.interview;import java.util.concurrent.Executor;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class LampController { private static LampController instance=new LampController(); public static LampController getInstance(){return instance; } private Lamp currentLamp=null; public LampController(){currentLamp=Lamp.S2N; } public void start(){currentLamp.light();Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { @Override public void run() {// TODO 自动生成的方法存根currentLamp=currentLamp.blackOut(); }},10,10,TimeUnit.SECONDS); } }(3)Road类:生成随机车辆,并根据交通灯控制车辆的通过
package com.isoftsone.interview;import java.util.*;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.newSingleThreadExecutor();pool.execute(new Runnable() { @Override public void run() {// TODO 自动生成的方法存根for(int i=1;i<1000;i++){ try {Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace(); } vechicles.add(Road.this.name+"_"+i);} }});ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() { @Override public void run() {// TODO 自动生成的方法存根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); }(4)TransportLamp交通灯项目主类,调用各个项目各个部分实现功能
package com.isoftsone.interview;import javax.swing.text.StyledEditorKit.ForegroundAction;public class TransportLamp { public static String[] RoadLine={"S2N","S2W","S2E","N2S","N2W","N2E","W2E","W2N","W2S","E2W","E2N","E2S"}; public static void main(String[] args) {// TODO 自动生成的方法存根new LampController().start(); for(int i=0;i<12;i++){ new Road(RoadLine[i]); } }}
--------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ------
- 《黑马程序员》交通灯管理系统
- 黑马程序员----交通灯管理系统
- <黑马程序员>交通灯管理系统
- 【黑马程序员】交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 《黑马程序员》交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员:交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-------交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员-交通灯管理系统
- MySql按周/月/日分组统计数据的方法
- 有关qsort函数的部分讲解
- Mysql的常用数据类型以及用途总结
- Git远程操作详解
- 黑马程序员——学习日志8集合
- 【黑马程序员】交通灯管理系统
- 黑马程序员_JAVA_枚举和反射总结
- OR1200数据Cache介绍
- 线上进行调整,不至于像以前一样经历退货和返工的麻烦。对于标准产品满足不同客户的多样需求,是营销理念上的进步
- Android学习系列(18)--App工程结构搭建
- 进程保护
- Advanced Programming in MATLAB 高级matlab程序设计
- 使用batch insert解决MySQL的insert吞吐量问题 - billy鹏
- Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据