交通灯管理系统

今天学习了张老师的模拟交通灯管理系统视频:

首先做这个项目之前,必须了解项目的需求,对这个项目进行需求分析。

要模拟交通灯管理系统要实现的三个类:灯(Lamp类)、灯控制器(LampControllere类)、路线(Road类)。

最好的方法是看图理解。

根据路线图:有如下路线:"S2N", "S2W", "E2W", "E2S" | "N2S", "N2E", "W2E", "W2N",  | "S2E", "E2N", "N2W", "W2S"

汽车看到前面是否有车,如果没有车就穿过。

(图片为前期拷贝某学员图片,便于理解)

具本实现如下:

//1.灯的实现

public enum Lamp {
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);

private Lamp(String opposite,String next,boolean lighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
private boolean lighted;
//定义变量存储对应的灯
private String opposite;
//定义下一个灯
private String next;

public boolean isLighted(){
return lighted;
}
//灯变绿
public void light(){
this.lighted=true;
//假如我有对应的灯,就把他变绿
if(opposite!=null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+" 变绿了,下面总共有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()+"-------->切换为"+next);
nextLamp.light();
}
return nextLamp;
}
}

//2.灯的控制器,控制灯的变绿
public class LampControllere {
//定义当前的灯
public Lamp currentLamp;

public LampControllere() {
//定义当前第一个灯变绿色
currentLamp=Lamp.S2N;
currentLamp.light();
//创建一个线程池,它可安排在给定延迟后运行命令或者定期地变亮
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
currentLamp=currentLamp.blackOut();
}
},
10, 
10, 
TimeUnit.SECONDS);
}
}

//3.路线

public class Road {
//路线,List为了面向AOP方面的编程
private List<String> vechicles=new ArrayList<String>();

private String name=null;

public Road(String name){
this.name=name;

//创建一个线程池,一组线程.如果一个类的后面带有s后缀,就是工具类.
ExecutorService pool=Executors.newSingleThreadExecutor();

pool.execute(new Runnable() {

@Override
public void run() {
for(int i=1;i<1000;i++){
//产生999辆车
try {
//让当前线程休眠1-9秒
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (Exception e) {
}
vechicles.add(Road.this.name+"_"+i);
}
}
});
//创建一个定时器
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
//
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
//把集合里面的第一辆车移走,先检查是否有车
if(vechicles.size()>0){
//检查当前的灯是为绿色
boolean lighted=Lamp.valueOf(Road.this.name).isLighted();
if(lighted==true){
System.out.println(vechicles.remove(0)+" is traversing !");
}
}
}
},
1, 
1,
TimeUnit.SECONDS);
}
}

//4.程序的主入口

public class MainClass {


public static void main(String[] args) {
String[] directions = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S",
"N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
for (int i = 0; i < directions.length; i++) {
new Road(directions[i]);


}
new LampControllere();
}
}

启发:借鉴张老师一句话:谁拥有数据,谁就对外提供操作这些方法的数据,也就是这句话,使我对面向对象有了一个更深入的理解。非常感谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值