----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -------
黑马程序员_交通管理系统DAY16
其实对于这个交通管理系统中最难的还是用面向对象的思想去设计,找出这些类,并设计其中的方法。
对于这个系统分为三个类,Road(路),Lamp(灯),LampControl(灯的控制器)
能分清了这三个类,那我们就可以分别实现这些类中的方法了。
#整体的把握#
这个交通管理系统分为十二条路,如下图:
其实中间只有四条路是起决定性作用的,开始的时候,我也不太明白,但是当我自己重写一遍,觉得很清晰了,四条也就是途中的1,2,3,4,,为什么其他的在这个系统中不太重要,主要原因是我们分析问题的角度不一样,当执行1时,也就是从南往北,这时,相对的方向的车也可以执行,同理当我们从东到南时,从西往北也可以走,这样我们只要考虑一边就可以了。注意一个重点是车子往右转时,不需要看灯。虽然这四个方向没有灯但是我们要假设有灯,但这个灯一直是绿的,这是为了系统更容易设计。
#对路(Road)的分析#
涉及随机产生车辆,定时器的制作
路的名字也就是十字路口,不同方向的路,如S2N,N2S就是两条路。
在路中除了有名字以外,我们还要定义一个集合,就是车子的集合,因为这些车都是在路上跑的,面向对象的核心就是谁拥有数据,谁就是操作这个方法的对象.
在这个路的构造方法中,我们应该注意我们除了初始化这个路名外,我们应该产生一个线程来模拟车子的来往,就是车子过一会经过一辆。同时我们需要一个定时器,看是否车子可以过了,如果可以了,我们就直接用remove第一个,也就是remove(0)
下面也就是这个类的代码:
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培训、期待与您交流! -------