总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制。右转弯的4条路线的控制灯假设称为常绿状态,另外,其他的8条路线是两两成对的,可以归为4组,所以,程序只用考虑垂直行走状态,平行行走状态,垂直转平行状态,平行转垂直状态,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。

在设计的时候,初步思考是南北朝向的直走,然后南北朝向的左转,然后东西朝向的直走,然后东西朝向的左转。

我们初步设想一下有哪些对象:红绿灯,红绿灯控制系统,汽车,路线。另外灯是跟路线绑定的。汽车不是看到自己所在路线对应的灯绿了就穿过马路,还需要看其面前是否有车,判定是否有车的方法应该在路上,路中储存着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。

面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供这些数据的方法。再牢牢掌握几个典型的案例就可以了:人在黑板上画圆,列车司机紧急刹车,售货员统计小票的金额,你把门关上了

面试题:

两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子。

如果说把石头变成石刀,变成石刀这个方法如果安在石头上,那么意味着这个对象有一个方法把自己加工没有,这显然不科学。

此处说是”两块”石头变成”一把”石刀,KnifeFactory.createknife()方法接受的参数应该是两块石头,所以,createKnife()方法的完整定义形式应该为:createKnife(Stone first, Stone second)。

接下来石刀有个wood=StoneKnife.cut(tree);

接下来木头中有如果有做成椅子的方法,又是把自己变没有了,所以必须要有ChairFactory这个方法Chair= ChairFactory.makeChair(wood);

球从一根绳子的一段移动到了另一端

class Rope{

private Point start;

private Point end;

public Rope(Point start, Point end){

this.start=start;

this.end=end;

}

public Point nextPoint(Point currentPoint){

/*通过两点一线的数学公式可以计算出当前点的下一个点,这个细节不属于设计阶段要考虑的问题,如果当前点是终止点,则返回null,如果当前点不是线上的点,则抛出异常。*/

}

}

class Ball{

private Rope rope;

private Point currentPoint;

public Ball(Rope rope, Point startPoint){

this.rope=rope;

this.currentPoint=startPoint;

}

public void move(){

currentPoint=rope.nextPoint(currentPoint);

System.out.println(“小球移动了”+currentPoint);

}

}

每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。

设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象

每条路线上随机增加新的车辆,增加到一个集合中保存。

每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红,应该将下一个方向的灯变绿。

设计一个lamp类来表示一个交通灯,每个交通的那个都维持一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。

总共有12条路线,所以,系统中总共要产生12个交通灯(用枚举)。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。

除了右拐弯方向的其他8条路线的灯,他们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次变亮,与这4个灯方向对应的灯则随之一同变化,因此lamp类中要有一个变量来记住自己想法方向的灯,在一个lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随着下一个灯的变亮,Lamp类中海油一个变量来记住自己的下一个灯。

无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以lamp类改为用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。

设计一个LampController类,它定时让当前的绿灯变红。

Road类的编写

每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。

在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形式的字符串进行表示)。

在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。

在装车的时候不能一直装,要用线程去控制,尽量用jdk5自带的线程池

ExecutorService pool= Executors.newSingleThreadExecutor();

pool.execute(new Runnable(){

public void run(){

}

});

定时器的制作:

ScheduleExecutorService timer= Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(new Runnable(){

public void run(){

}

},

1,

1,

TimeUnit.SECONDS);

timer.schedule(new Runnable(){},//这个方法是过一秒做这件事,不涉及到循环

1

unit);

内部类要访问外部类的局部变量,外部类的局部变量要加final,也可以通过Road(外部类的名字).this.name(这种方法是因为局部变量和成员变量的变量名字一样)当不一样时也可以用this.name

Lamp类的编写

系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。

每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。

增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。

除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象的nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。

枚举类的一个使用技巧

当枚举中的对象,传的参数是这个枚举类的枚举对象的时候,我们可以传跟这个对象同名的字符串然后用枚举的静态valueOf方法转换成枚举对象

 

LampController类的编写

整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。

LampController构造方法中要设定第一个为绿的灯。

LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。

MainClass类的编写

用for循环创建出代表12条路线的对象。

接着再获得LampController对象并调用其start方法

转载于:https://www.cnblogs.com/fred-zhang/p/TrafficLamp.html

java编写交通灯思路相关推荐

  1. java中交通灯管理系统_java案例--交通灯管理系统学习

    一.需求分析 刚接到一个项目或者面试题(总之是一个相对比较复杂的问题时),应该对认真阅读问题的 要求和描述,并通过对这些的分析进行抽象,通过一个个对象的方式来考虑自己的程序该 怎么写.所以,首先来看看 ...

  2. 学习笔记-java编程-交通灯管理器设计流程。

    先抛出需求: 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 . ...

  3. 用verilog语言编写交通灯程序

    1. 源代码 ( 1)控制器模块 module traffic_lights(clk,rst,count,ew,sn); input clk,rst; input[5:0] count; output ...

  4. Java编程实战--交通灯管理系统分析与设计

    2019独角兽企业重金招聘Python工程师标准>>>                                                  面向对象思想分析和设计 一. ...

  5. Java经典题目:交通灯系统

    交通灯管理系统 第一部分:需求 一.模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向 ...

  6. 『BDD100K的labels文件json转YOLOV5要求的txt文件』【包括识别交通灯】(代码编写)

    『BDD100K的labels文件json转YOLOV5要求的txt文件』[包括识别交通灯](代码编写) import osimport jsonclass BDD_to_YOLOv5:def __i ...

  7. 交通灯管理系统思路总结

    一.思路明确 交通灯系统模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: --异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆  ...

  8. java交通灯英文文献_java 交通灯管理系统源代码.doc

    java 交通灯管理系统源代码.doc 还剩 5页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: private String next:public ...

  9. 全国交通咨询模拟java_全国交通咨询模拟系统java 编写(课程设计报告).doc

    全国交通咨询模拟系统java 编写(课程设计报告) 全国交通咨询模拟 一.实习目的 通过实习,了解并初步掌握设计.实现较大系统的完整过程,包括系统分析.编码设计.系统集成.以及调试分析,熟练掌握数据结 ...

最新文章

  1. 跨链Cosmos(4)Tendermint Core
  2. java sql函数_Java调用Sql存储过程实例讲解
  3. 4.0 编译apk中无classes.dex问题解决方法
  4. 程序运行 栈帧分析 以及 修改栈帧中数据以及函数地址
  5. 日语学习-多邻国-平假名
  6. 图解Python多修饰器时哪个先起作用
  7. [译] 用 Redis 和 Python 构建一个共享单车的 app
  8. Scala学习--《Scala编程》
  9. 单例模式及多线程安全(C++版)
  10. SQL Injection***技术总汇(ASP+SQL Server版)v1.0
  11. 四川水泥杂志四川水泥杂志社四川水泥编辑部2022年第11期目录
  12. 华北计算机系统工程研究所 韩庆,华北电力大学学报(自然科学版)
  13. 解决mac压缩包在windows下解压乱码问题。
  14. IPSec之IKEv2详解
  15. 产品经理——产品原型设计规范
  16. 关于8杯酒只有一杯酒有毒,每个人是否中毒只能化验一次,至少需要几个人辨识。...
  17. 从现实世界的角度去理解计算机领域的知识
  18. SQL Server Arithmetic overflow error converting nvarchar to data type numeric
  19. 已知校验矩阵(监督矩阵)或生成矩阵G怎样生成所有可能码字
  20. oracle11g exp 00028,解决Linux系统下exp导入EXP-00028异常

热门文章

  1. import提升导致Fundebug报错:“请配置apikey”
  2. mysqldump备份单表数据
  3. HDU 1853 MCMF
  4. BZOJ 2434 阿狸的打字机
  5. C# 中的 sealed(密封) 关键字
  6. 红帽集群套件RHCS
  7. 混合商业模式解决方案-----多种电子商务模式的融合与创新
  8. GridView中DropDownList联动
  9. 运维笔记--postgresql占用CPU问题定位
  10. Python面向对象2:类与对象的成员分析及self