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

时间:2023-02-17 20:07:29

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


1.交通管理系统的项目需求分析

通过画图,可以分析一共有十二条路线,经综合分析,只需要考虑其中的四条路线即可

从南来的  去往  北的车辆---------------------------直行

从南来的  去往  西的车辆---------------------------左拐

从东来的  去往  西的车辆---------------------------直行

从东来的  去往  南的车辆---------------------------左拐


黄色信号灯,时间短可以先不考虑,只考虑红绿灯

根据生活习惯分析,放行的步骤是

直行---------> 拐弯---------> 直行

其中右拐弯,不受信号灯的限制

变灯时间通话线程sleep方法来描述


2.面向对象的分析与设计

面向对象设计把握一个重要的经验:谁拥有数据,谁就有对外提供操作这些数据的方法

例如:人开门 人开车 售后员统计收获小票的金额 等。。


通过需求分析有三个对象 交通道路Road 交通灯Lamp 交通灯控制器LampController

交通道路一共有12条,所以需要12个对象

每条路随机产生一些车辆,存入一个集合当中,这些车辆每个一秒去检查交通灯是否为绿色,是绿色就通过


交通灯是对应着道路来说的,因此交通灯也有12个,采用枚举类其中有可以是灯变绿,变红的方法

其中变红灯的方法中应有是下一个等变绿的代码。

12个交通灯中,有4个灯不受红绿灯限制,8个受红绿灯的限制

这个8个灯相互对应的,在编程的过程中只考虑4个就可以啦。


LampController类是控制交通灯,变绿和变红。


3.代码的实现

(1)Lamp 交通灯

package com.chongchong.interview;

/**
* 交通灯枚举类
* @author hao
*
*其中这个系统中有12个灯 每个对象都有都有 是否是绿的的状态lighted 相对应的灯opposite
*
*下一个等 next
*/
public enum Lamp {

//通过分析只要这四个灯受红灯控制即可
S2N(false,"N2S","S2W"),S2W(false,"N2E","E2W"),E2W(false,"W2E","E2S"),E2S(false,"W2N","S2N"),
//下面的灯为上面等对应的相反的灯
N2S(false,null,null),N2E(false,null,null),W2E(false,null,null),W2N(false,null,null),
//下面的灯为右转弯的灯 不受红灯的限制的
S2E(true,null,null),E2N(true,null,null),N2W(true,null,null),W2S(true,null,null);

//交通的的状态
private boolean lighted;
//与之对应的交通灯
private String opposite;
//下一个交通灯
private String next;

//判断现在 交通的的状态 绿灯为true 红灯为false
public boolean isLighted() {
return lighted;
}

//是交通等变为绿色
public void light(){
this.lighted= true;
//与其相反的灯 也要变成绿色
if(opposite != null)
{
Lamp.valueOf(opposite).light();
}
System.out.println(this.name()+"和"+this.opposite+"灯变绿啦。。。汽车开始走啦");
}

//使绿灯变为红色
public Lamp lightOut()
{
this.lighted=false;

if(opposite != null){
Lamp.valueOf(opposite).lightOut();
}


//使下一个等变为绿色
Lamp nextLamp = null;
if(next != null)
{
nextLamp = Lamp.valueOf(next);
System.out.println("变灯啦");
nextLamp.light();
}

return nextLamp;
}

//交通灯的构造方法
private Lamp(boolean lighted, String opposite, String next) {
this.lighted = lighted;
this.opposite = opposite;
this.next = next;
}



}

(2)Road交通道路

package com.chongchong.interview;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
* 交通道路Road
* @author hao
*
*有12条道路,每条道路在创建时,随机产生一些车辆,存入一个集合当中
*每条道路每个一秒会看一下交通灯,如果为绿色 就使第一辆车通过
*/
public class Road
{
//交通路集合
List<String> vechicles = new ArrayList<String>();

//交通路的名字
private String name;

//交通路的构造方法
public Road(final String name)
{
this.name = name;

//模拟道路上的车辆
ExecutorService pool = Executors.newSingleThreadExecutor();

pool.execute(new Runnable() {
public void run() {

for(int i = 1 ; i< 1000; i++)
{
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(name +"_"+ i);
}
}
});


//道路每隔一秒会检查灯是否为绿色 为绿色就放行一辆车
ScheduledExecutorService time =Executors.newScheduledThreadPool(1);

time.scheduleAtFixedRate(
new Runnable() {
public void run() {
if(vechicles.size()>0)
{
boolean light = Lamp.valueOf(name).isLighted();
if(light)
{
System.out.println(vechicles.remove(0)+"正在过马路 traversing");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}


}

(3) LampController 交通灯控制器

package com.chongchong.interview;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
* 交通灯控制器
* @author hao
*
*控制红绿灯
*/
public class LampController {

//当前灯
private Lamp currentLamp;

//每个10控制交通灯 变红和变绿
public LampController()
{
//一开始使S2W为绿灯
currentLamp = Lamp.S2W;

ScheduledExecutorService time = Executors.newScheduledThreadPool(1);

time.scheduleAtFixedRate(
new Runnable(){
public void run()
{
System.out.println("计时器启动");
currentLamp= currentLamp.lightOut();
}
},
10,
10,
TimeUnit.SECONDS);


}
}


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------