黑马程序员_交通管理系统DAY16

                      ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -------                  

                                   

                                       黑马程序员_交通管理系统DAY16


其实对于这个交通管理系统中最难的还是用面向对象的思想去设计,找出这些类,并设计其中的方法。

对于这个系统分为三个类,Road(路),Lamp(灯),LampControl(灯的控制器)

 能分清了这三个类,那我们就可以分别实现这些类中的方法了。

#整体的把握#

这个交通管理系统分为十二条路,如下图:


其实中间只有四条路是起决定性作用的,开始的时候,我也不太明白,但是当我自己重写一遍,觉得很清晰了,四条也就是途中的1,2,3,4,,为什么其他的在这个系统中不太重要,主要原因是我们分析问题的角度不一样,当执行1时,也就是从南往北,这时,相对的方向的车也可以执行,同理当我们从东到南时,从西往北也可以走,这样我们只要考虑一边就可以了。注意一个重点是车子往右转时,不需要看灯。虽然这四个方向没有灯但是我们要假设有灯,但这个灯一直是绿的,这是为了系统更容易设计。

#对路(Road)的分析#

涉及随机产生车辆,定时器的制作

路的名字也就是十字路口,不同方向的路,如S2NN2S就是两条路。

在路中除了有名字以外,我们还要定义一个集合,就是车子的集合,因为这些车都是在路上跑的,面向对象的核心就是谁拥有数据,谁就是操作这个方法的对象.

在这个路的构造方法中,我们应该注意我们除了初始化这个路名外,我们应该产生一个线程来模拟车子的来往,就是车子过一会经过一辆。同时我们需要一个定时器,看是否车子可以过了,如果可以了,我们就直接用remove第一个,也就是remove0

下面也就是这个类的代码:

package cn.itcast.interview.traffic;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
/**
 * @param args
 */
private String name;
private ArrayList<String> cars=new ArrayList<String>();
public Road(String name) throws Exception
{
this.name=name;
//产生一个线程
 ExecutorService es=Executors.newSingleThreadExecutor();
 es.execute(new Runnable(){
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<1000;i++)
{
try{
Thread.sleep((new Random().nextInt(10)+1)*1000);
}catch(Exception e){
e.printStackTrace();
}
//其实这里可以加final,但是这又有一种新的方法
cars.add(Road.this.name+"_"+i);
}
}
 
 });
 //定时器的制作
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run()
{
{
boolean lighted=Lamp.valueOf(Road.this.name).islighted();
//不要在与true比较
if(lighted)
{
if(cars.size()>0)
System.out.println(cars.remove(0)+"is remove");
}
}
}
},
1, 1,
TimeUnit.SECONDS);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}


#对灯(Lamp)的分析#

在写灯类之前,我们应该先考虑,有哪些灯,因为这里有12条路,所以我们这里选择了用枚举的方法

第一步:先写出这十二条路,这个路上分别对应有灯。

     S2N,S2W,E2W,E2S,

 N2S,N2E,W2E,W2N

 S2E,E2N,N2W,W2S;

这个灯是否亮,所以我们写一个方法判断一下islighted(),同时我们也要写开灯与关灯的方法。

第二步:当我们关了这个灯时,是否我们要把下一灯亮起来。或者等我们这个灯亮起来了,对面的灯也要亮起来啊,因为这样才能同时南北通车。

这是我们对应的Lamp


package cn.itcast.interview.traffic;
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 oppoLamp, String nextLamp,boolean lighted)
 {
this.oppoLamp= oppoLamp;
this.nextLamp=nextLamp;
this.lighted=lighted;
 }
 
 private Lamp()
 {
 }
 private boolean lighted;
 //对应的灯
 private String oppoLamp;
 
 //下一个灯
 private String nextLamp;
 public boolean islighted()
 {
 return lighted;
 }
 public void light()
 {
 
 //这里注意当这灯有相反方向时,如:S2N,N2S,我们的相反方向的灯亮了的时候,
 //
 this.lighted=true;
 //这里不会造成死循环,因为相反方向的灯的没有相反方向的灯,如
 //S2N在我们初始化时,我们可以找到他的相反方向的灯,但是我们定义N2S时他的相反
 //方向为null
 if(oppoLamp!=null)
 {
 
 Lamp.valueOf(oppoLamp).light(); 
 }
 System.out.println(name()+"is green");
// if(nextLamp!=null)
// {
// Lamp.valueOf(nextLamp).breakOut();
// }
 }
 public Lamp breakOut()
 {
 this.lighted=false;
 if(oppoLamp!=null)
 {
 
 Lamp.valueOf(oppoLamp).breakOut() ; 
 }
 Lamp next=null;
 if(nextLamp!=null)
 {
 next= Lamp.valueOf(nextLamp);
 next.light();
 }
 return next;
 }
}


#灯的控制类(Lampontrol#

等我们有灯类后,我们要控制多长时间亮一下,在到下一个方向,这样才能正常运行,这里没有上面复杂,就是通过一个定时器来控制灯


package cn.itcast.interview.traffic;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampControl {
/**
 * @param args
 */
    private Lamp currentLamp;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public LampControl()
{
this.currentLamp=Lamp.S2N;
currentLamp.light();
ScheduledExecutorService  es=Executors.newScheduledThreadPool(1);
es.scheduleAtFixedRate(new Runnable(){
public void run() {
// TODO Auto-generated method stub
currentLamp=currentLamp.breakOut();
}}, 
10,
10, 
TimeUnit.SECONDS);
}
}


#主类#

当我们写完这些类后,我们是否要写一个主类来执行这个系统,

主类的作用就是将LampControl(),与12条路都new出来,这样系统就可以运行了,但是注意的是这里为什么我们没有new车呢,因为我们这里的车在路中的,在路中有一个集合,每隔多少秒,自动产生随机车。

package cn.itcast.interview.traffic;
public class mainClass {
/**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String[] str={"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
for(int i=0;i<str.length;i++)
{
new Road(str[i]);
}
new LampControl();
}
}



                ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -------             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值