黑马程序员 交通灯系统

黑马程序员——交通灯系统 一、需求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1、异步随机生成按照各个路线行驶的车辆。 例如:       由南向而来去往北向的车辆----直行车辆       由西向而来去往南向的车辆---- 右转车辆       由东向而来去往南向的车辆---- 左转车辆       …. 2、信号灯忽略黄灯,只考虑红灯和绿灯。 3、应考虑左转车辆控制信号灯,右转车辆不受 阅读详情

------- android培训、java培训、期待与您交流! ----------

1,张老师在一开始为了提高同学们的面向对象的设计思维能力,便引出了两个例子:

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

张老师的是这样设计的:

首先有这样几个类

Stone//石头

StoneKnife//石刀,这个类里面有一个publicMaterial cut(Tree tree)方法

Material//材料

Tree//树

Chair//椅子

然后张老师想到石头磨出刀后石头自己就应该没了,材料做成椅子后也应该没了,张老师觉得这样的思想如果要设计到对象所对应的类里面就比较难以实现,所以就又设计了两个工厂类

KnifeFactory//这个类里面有个createKnife(Stonestone1,Stone stone2)方法

ChairFactory//这个类里面有个makeChair(Materialmaterial)方法

个人觉得张老师的设计这两个工厂类是没有必要的,类多了就过于复杂了,况且他这样设计似乎也没有达到让对象自己把自己变没了的目的,下面我给出我的设计,个人觉得比张老师的要好点,也许我的还没有他设计的好,仅供交流,呵呵……

  1.    
  2.   
  3. public class CharMake {  
  4.     public static void main(String[] args) {  
  5.         StoneKnife stoneKnife = new Stone().produceStoneKnife(new Stone());// 磨刀  
  6.         Wood wood = stoneKnife.cutTree(new Tree(20));// 砍树  
  7.         wood.makeChar();// 做成椅子  
  8.     }  
  9. }  
  10.   
  11. /* 定义一个Stone类来封装石头 */  
  12. class Stone {  
  13.     private int life = 1;// 表示石头的生命,磨出一把石刀后就不存在了,即生命变为0  
  14.   
  15.     public StoneKnife produceStoneKnife(Stone stone) {  
  16.         if (1 == this.life & 1 == stone.life) {  
  17.             this.life = 0;  
  18.             stone.life = 0;// 石刀麻成后,两块石头就不存在了,所以生命为0  
  19.             System.out.println("两块石头磨成一把石刀");  
  20.             return new StoneKnife();// 返回生产出来的石刀  
  21.         }  
  22.         System.out.println("制刀失败");  
  23.         return null;  
  24.     }  
  25. }  
  26.   
  27. /* 定义一个StoneKnife类来封装石刀 */  
  28. class StoneKnife {  
  29.     private int life = 100;// 表示石刀的生命,  
  30.   
  31.     public Wood cutTree(Tree tree) {  
  32.         if (tree.getLife() > 0 & life > tree.getLife()) {  
  33.             int treeLife = tree.getLife();  
  34.             life -= treeLife;// 每砍完一棵树,石刀就根据树的大小而减少相应的生命值  
  35.             tree.setLife(0);// 树被砍了后生命变为0  
  36.             System.out.println("石刀可以砍树,砍成木材");  
  37.             return new Wood(treeLife);// 树的生命转化为木材的生命  
  38.         }  
  39.         System.out.println("砍树失败");  
  40.         return null;  
  41.     }  
  42. }  
  43.   
  44. /* 定义一个Tree类来封装树 */  
  45. class Tree {  
  46.     private int life;// 树的生命  
  47.   
  48.     public Tree(int life) {  
  49.         this.life = life;  
  50.     }  
  51.   
  52.     public int getLife() {  
  53.         return life;  
  54.     }  
  55.   
  56.     public void setLife(int life) {  
  57.         this.life = life;  
  58.     }  
  59. }  
  60.   
  61. /* 定义一个Wood类来封装木材 */  
  62. class Wood {  
  63.     private int life;// 木材的生命  
  64.   
  65.     public Wood(int life) {  
  66.         this.life = life;  
  67.     }  
  68.   
  69.     public Chair makeChar() {  
  70.         if (life >= Chair.wood) {  
  71.             life -= Chair.wood;// 木材做出来一把椅子后,就减少相应的生命值  
  72.             System.out.println("木材可以做成椅子");  
  73.             return new Chair();  
  74.         }  
  75.         System.out.println("制作椅子失败");  
  76.         return null;  
  77.     }  
  78.   
  79.     public int getLife() {  
  80.         return life;  
  81.     }  
  82.   
  83.     public void setLife(int life) {  
  84.         this.life = life;  
  85.     }  
  86. }  
  87.   
  88. /* 定义一个Chair类来封装椅子 */  
  89. class Chair {  
  90.     public static int wood = 2;// 制作一把椅子需要消耗的木材资源  
  91. }  

例二:球从一根绳子的一端移动到了另一端

张老师是这样设计 的

  1.    
  2. class Rope{  
  3.     private Point start;  
  4.     private Point end;  
  5.     public Rope(Point start, Point end){  
  6.         this.start = start;  
  7.         this.end = end;  
  8.     }  
  9.     public Point nextPoint(Point currentPoint){  
  10.         /*通过两点一线的数学公式可以计算出当前点的下一个点,这个细节不属于设计阶段要考虑的问题, 
  11.          * 如果当前点是终止点,则返回null,如果当前点不是线上的点则抛出异常 
  12.          * */  
  13.     }  
  14. }  
  15. class Ball{  
  16.     private Rope rope;  
  17.     private Point currentPoint;  
  18.     public Ball(Rope rope,Point startPoint){  
  19.         this.rope = rope;  
  20.         this.currentPoint = startPoint;  
  21.     }  
  22.     public void move(){  
  23.         currentPoint = rope.nextPoint(currentPoint);  
  24.         System.out.println("小球移动到了"+currentPoint);  
  25.     }  
  26. }  

我是这样设计的

  1.    
  2. public class ballMove {  
  3.     public static void main(String[] args) {  
  4.         new Ball().moveOnRope(new Rope(30));  
  5.     }  
  6. }  
  7.   
  8. /* 定义一个Ball类来代表球 */  
  9. class Ball {  
  10.     /* moveOnRope方法模拟球在绳子上移动的过程 */  
  11.     public void moveOnRope(Rope rope) {  
  12.         System.out.println("出发");  
  13.         for (int i = 0; i <= rope.getLength(); i++) {  
  14.             System.out.println("已经走了" + i + "米");  
  15.         }  
  16.         System.out.println("到达另一端");  
  17.     }  
  18. }  
  19.   
  20. /* 定义一个Rope类来代表绳子 */  
  21. class Rope {  
  22.     private int length;  
  23.   
  24.     public Rope(int length) {  
  25.         this.length = length;  
  26.     }  
  27.   
  28.     public int getLength() {  
  29.         return length;  
  30.     }  
  31. }  

我觉得我和张老师的不同就在于他把绳子设计在了一个二维空间里,而我则是把绳子设计在了一个一维空间里

下面是我自己模拟的这个交通灯系统

  1.    
  2. package com.isoftstone.interview.traffic;  
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Random;  
  7.   
  8. public class MainClass {  
  9.     public static void main(String[] args) {  
  10.         new Controller();  
  11.     }  
  12. }  
  13.   
  14. class Controller {  
  15.     /* 
  16.      * 一个十字路口就是两条路相交,所以这里创建两条路 一条东西干道,一条南北干道 初始状态为东西干道的绿灯亮,南北干道的红灯亮 
  17.      */  
  18.     private Road roadEW = new Road(true, "东西干道");  
  19.     private Road roadSN = new Road(false, "南北干道");  
  20.   
  21.     public Controller() {  
  22.         System.out.println("东西干道 绿灯亮,南北干道红灯亮");// 打印初始状态  
  23.         new Thread(new Runnable() {  
  24.             @Override  
  25.             public void run() {  
  26.                 while (true) {  
  27.                     try {  
  28.                         Thread.sleep(30000);  
  29.                     } catch (InterruptedException e) {  
  30.                         e.printStackTrace();  
  31.                     }  
  32.                     roadEW.changeLight();  
  33.                     roadSN.changeLight();  
  34.                 }  
  35.             }  
  36.   
  37.         }).start();// 每隔30秒换次信号灯  
  38.     }  
  39. }  
  40.   
  41. class Road {  
  42.     /* 每条道上的车的去向只有3个,即向左转,直行,向右转 */  
  43.     private static final String[] goTo = { "left", "front", "right" };  
  44.     /* 
  45.      * 每条道上都有一个信号等,本来这里可以是静态的,但是为了体现面向对象的设计思想, 我就没有把它定义为静态的 
  46.      */  
  47.     private boolean light;  
  48.     /* 保存路的名字,这主要是为了方便测试,在打印时可以打印出是哪条路在通行 */  
  49.     private String name;  
  50.   
  51.     /** 
  52.      *  
  53.      * @param light 
  54.      *            道路上路灯的初始状态 
  55.      * @param name 
  56.      *            道路的名字 
  57.      */  
  58.     public Road(boolean light, String name) {  
  59.         this.light = light;  
  60.         this.name = name;  
  61.         /* 当道路一创建,道路上就开始行驶车辆了 */  
  62.         this.removeThread(left, "左边");  
  63.         this.removeThread(right, "右边");  
  64.         this.addThread(left);  
  65.         this.addThread(right);  
  66.     }  
  67.   
  68.     public void changeLight() {  
  69.         light = true == light ? false : true;// 路灯转换  
  70.         if (light) {  
  71.             System.out.println(this.name + "绿灯亮,");  
  72.         } else {  
  73.             System.out.println(this.name + "红灯亮,");  
  74.         }  
  75.     }  
  76.   
  77.     public void removeThread(final List<car> list, final String listname) {  
  78.         new Thread(new Runnable() {  
  79.   
  80.             @Override  
  81.             public void run() {  
  82.                 while (true) {  
  83.                     try {  
  84.                         Thread.sleep(1000);  
  85.                     } catch (InterruptedException e) {  
  86.                         e.printStackTrace();  
  87.                     }  
  88.                     if (0 != list.size()) {// 如果道上的车辆数不为0  
  89.                         if (Road.this.light  
  90.                                 | list.get(0).getGoTo().equals("right")) {  
  91.                             /* 道路上亮的是绿灯或者最前面的那辆车是向右转就旅行 */  
  92.                             System.out.println(Road.this.name + listname  
  93.                                     + "使过一辆向" + list.get(0).getGoTo()  
  94.                                     + "方向行驶的车");  
  95.                             list.remove(0);  
  96.                         }  
  97.                     }  
  98.                 }  
  99.             }  
  100.         }).start();  
  101.     }  
  102.   
  103.     public void addThread(final List<car> list) {  
  104.         new Thread(new Runnable() {  
  105.   
  106.             @Override  
  107.             public void run() {  
  108.                 while (true) {  
  109.                     try {  
  110.                         Thread.sleep(1000);  
  111.                     } catch (InterruptedException e) {  
  112.                         e.printStackTrace();  
  113.                     }  
  114.                     /* 增加车辆 */  
  115.                     list.add(new Car(goTo[new Random().nextInt(3)]));  
  116.                 }  
  117.             }  
  118.         }).start();  
  119.     }  
  120.   
  121.     /* 每条道路都是双向道,所以我们这里就用两个集合来存储这两个道上的车辆 */  
  122.     private List<car> left = new ArrayList<car>();  
  123.     private List<car> right = new ArrayList<car>();  
  124. }  
  125.   
  126. class Car {  
  127.     private String goTo;// 储存车辆的去向,左转,直行或者右转  
  128.   
  129.     public Car(String goTo) {  
  130.         this.goTo = goTo;  
  131.     }  
  132.   
  133.     /* 获取车辆的去向 */  
  134.     public String getGoTo() {  
  135.         return goTo;  
  136.     }  
  137. }  
  138. </car></car></car></car></car></car>  

 


[黑马程序员]交通灯系统--自己设计 看了张老师的交通灯面试题的jiangj 阅读详情

相关推荐

Windows 11 上 WSL2 安装 Ubuntu 22.04 保姆级教程(含桌面环境配置)

本文提供在Windows 11上通过WSL2安装Ubuntu 22.04并配置桌面环境的详细教程。涵盖WSL2核心安装、性能调优、Xfce桌面环境部署以及开发环境集成,帮助开发者构建高效、无缝的Windows-Linux混合开发工作站。

Jerry的专栏 633

黑马程序员_交通灯系统

/** *1,交通灯系统三要素:交通灯,交通灯控制器,路。 *2,交通灯控制12调路线,四条主路线,四条跟随路线,四条自由路线。 *3,交通灯控制器,设置初始灯,并控制交通灯的切换动作。 *4,路拥有存储车辆和根据交通灯信号放行车辆的功能。 */ import java.util.*; import java.util.concurrent.*; public class Traf

宣的专栏 697

LangGraph的容错机制:从节点失败到图级回滚

核心概念铺垫:讲解LLM应用容错与事务性的核心概念(幂等性、重试策略、降级策略、快照、回滚、原子性、一致性、隔离性、持久性、最终一致性),对比LangGraph容错机制与传统数据库ACID事务、Apache Airflow/Kubernetes Workflow/Kubeflow Pipelines容错机制的异同;LangGraph容错机制的演进历史:用markdown表格梳理LangGraph从0.0.1到1.5.0(截止202X年X月)的容错机制发展历程;节点级别的容错:重试与降级。

AI Python 编程之道的博客 171

【黑马程序员】交通灯系统

------- android培训、java培训、期待与您交流! ------…… 模拟 交通灯系统的要求与分析: 使用画图的方式进行分析会更加直观易懂: 具体分析: 代码详细分析与示例: Road类: 1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。 2.在Road对象的构造方法中启动一个线程每隔一个

u010624087的专栏 576

【YOLO系列】YOLOv12详解:模型结构、损失函数、训练方法及代码实现

本文提出YOLOv12,一种以注意力为中心的实时目标检测框架,通过创新性改进解决传统YOLO模型在精度与速度上的失衡问题。核心贡献包括:1)轻量混合注意力模块(LHA)结合通道与空间注意力,在不增加计算负担下提升特征提取能力;2)区域注意机制与R-ELAN网络优化特征聚合,显著改善小目标检测(AP_S提升8.3%);3)动态多光谱数据增强策略增强模型鲁棒性。实验表明,YOLOv12在COCO等基准上实现SOTA性能,同时保持2.1 TOPS/W的高能效比,适用于边缘设备部署。该工作为实时目标检测提供了新的注

一碗白开水一 1806

SwiftUI 5 教程之 SwiftData使用入门(教程含源码)

对我来说,记住日期很难。是的,您可以设置该日期的提醒,但该提醒无法产生紧迫感。让我们创建一个应用程序,我们可以在其中添加将来发生的事件。如果我们可以在主应用程序上看到所有即将发生的活动,那就太好了。也许将它们添加到小部件上以营造紧迫感。对于任何事件,我们需要跟踪哪些事情?我们将在下一篇文章中添加更多属性,其中我们将讨论迁移。现在,这就是我们所需要的。开始吧。

iCloudEnd的博客 986

黑马程序员——交通灯系统学习总结

------- android培训、java培训、期待与您交流! ---------- 1交通灯系统需求分析和设计 需求:该系统是模拟十中字路处车辆依据交通灯的颜色(红、绿)判断各个方向的车辆是否可通行,具体要求如下: 异步随机生成按照各个路线行驶的车辆 例如:由南向而来去往北向的车辆 ---- 直行车辆        由西向而来去往南向的车辆 ---- 右转车辆        由东向

hu121618hu的专栏 699

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

黑马程序员_交通灯系统实例

一共有十二条线路: S2N, N2S(直行) W2E, E2S(直行) S2W, N2E(左转) W2N, E2S(左转)  S2E,   W2S(右转)  W2N, N2E(右转)  为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的四条线路可以假设为常绿 状态,另外其他八条线路是两两成对的,可以归纳位4组,所以程序只需考虑图中标注了数字的4条线路的控制灯的切

cuzval的专栏 518

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 998

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 371

黑马程序员——交通灯调度系统

交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如:        由南向而来去往北向的车辆 ---- 直行车辆        由西向而来去往南向的车辆 ---- 右转车辆        由东向而来去往南向的车辆 ---- 左转车辆        。。。 信号灯忽略黄灯,只考虑红灯和绿灯。

黑马程序员学习日记 786

ABAP ALV 导出总被锁死为固定格式?把 Always Use Selected Format 一键重置到可选状态

摘要:SAP ALV报表导出时勾选"Always Use Selected Format"会导致导出格式被锁定,无法切换格式。文章分析该问题原因(系统持久化配置),提供用户自助解法(ALV list使用&RESET_EXCEL命令码,ALV grid通过右键菜单恢复弹窗),管理员治理方案(使用SALV_BS_ADMIN_MAINTAIN报表批量处理),并指出SAP_BASIS 7.02版本的特殊处理方式(需参考SAP Note 1716802和1590484)。最后给出排障清单,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217

黑马程序员 :交通灯系统的学习

交通灯管理项目模拟了对十字路口交通灯的控制,一般在我们生活中的十字路口是有人行道的,而此项目没有考虑人行道,到下面需求的第3条,右转车辆不受信号灯控制可以看出。 具体的需求如下: 1、异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ----

longshao365的专栏 424

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

------- android培训、java培训、期待与您交流! ----------   该“交通灯管理系统”,实现起来比较复杂,为了变量理解,这里分章节讲解。由浅入深,先分析项目的需求,其次分析项目中涉及到的面向对象原理,最后一步步通过代码实现该系统。为了便于阅读,博客前面加入了目录。 1. 交通灯管理系统项目需求 模拟十字路口的交通灯管理系统逻辑,具体需求如下 1. 异步

LanceDream的专栏 840

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 交通灯管理系统 模拟一个狮子路口的交通灯管理系统,逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。信号灯忽略黄灯,只考虑红灯和绿灯。应考虑左转车辆控制信号灯,右转车辆不受信号等控制。具体信号灯控制逻辑与现实生活中普通交通灯

FengLu369的专栏 676

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

黑马程序员_java交通灯系统

------- android培训、java培训、期待与您交流! ----------       在交通灯管理系统中,要模拟实现十字路口的交通管理系统逻辑,具体去求如下: 一 异步随机生成按照各个路线行驶的车辆。      例如:              由南而来往北去的车辆……直行车辆              由南而来往西去的车辆……左转车辆              由南而来

jason123_45的专栏 368

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

------- android培训、java培训、java学习型技术博客、期待与您交流! ---------- 进行面向对象的分析与设计 每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。        1.设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,          即系统中总共要产生12个R

ice1988的学习笔记 434

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

------- android培训、java培训、期待与您交流! ---------- 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:   Ø        异步随机生成按照各个路线行驶的车辆。 例如:        由南向而来去往北向的车辆 ---- 直行车辆        由西向而来去往南向的车辆 ---- 右转车辆        由东向而来去往南向的车辆 ---- 左

u010408616的专栏 543

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

交通灯管理系统

INT_INIT的专栏 831

黑马程序员—交通灯系统

交通灯系统的基本需求:             异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往南向的车辆----右转车辆 由东向而来去往南向的车辆----左转车辆              信号灯忽略黄灯,只考虑红灯和绿灯。              应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

静心远行 693

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

------- android培训、java培训、期待与您交流! ---------- I一、需求分析 1,模拟实现十字路口的交通灯管理系统逻辑,异步随机生成按照各个路线行驶的车辆。 例如:        由南向而来去往北向的车辆 ---- 直行车辆        由西向而来去往南向的车辆 ---- 右转车辆        由东向而来去往南向的车辆 ---- 左

u010036063的专栏 777

黑马程序员-Java基础11交通灯调度系统

一会更新

liushuai_android的专栏 649
上一篇: 黑马程序员 Java代理类
下一篇: 黑马程序员 银行业务调度
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值