黑马程序员——交通管理系统
-------android培训、java培训、期待与您交流! ----------
交通管理系统分析与思路:
1.面向对象设计一个重要经验,谁拥有数据,谁就对外提供操作这些数据的方法。
如:人在黑板上画圆,画圆的方法是圆提供的。列车司机紧急刹车,刹车动作方法,是列车提供的,人只是调用了这个方法而已。
2 . 交通管理系统是车看到对应的灯判断穿过马路的过程。采用名词提炼法:路,灯,控制灯变化的定时器,而车过马路,我们只是捕捉马路上减少一倆车的过程,所以车不需要描述成一个对象,用一个字符串表示即可。
3. 代码实现描述一个路类
</pre><div><pre name="code" class="java">package com.it7k;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//描述一个路
public class Road {
//维护一个集合,用来存储路上的车俩。
private List<String> vehicles = new ArrayList<String>();
//描述车名
private String name=null;
//给路初始化
public Road(String name){
this.name=name;
//由于初始化路时,不可能还等着添加完车辆才能创建,所以使用多线程。
new Thread(){
public void run(){
//路一创建,就产生1000俩车。
for(int i = 1 ; i<1000 ; i++){
try {
//由于车是每隔一段时间出现,所以让产生车辆出现间隔,随机产生,使用匿名对象
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//内部类访问外部类成员
vehicles.add(Road.this.name+"_"+i+"\t");
}
}
}.start();
//控制车辆的方法
PDvehicles();
}
//判断车俩是否行驶过马路线程。
public synchronized void PDvehicles(){
//创建一个线程池对象
ScheduledExecutorService ss = Executors.newScheduledThreadPool(1);
ss.scheduleAtFixedRate(
new Runnable(){
public void run(){
//如果集合中有车俩,则判断灯,为true移除车俩
if(vehicles.size()>0){
//获取当前灯的状态
boolean lighted = Lamp.valueOf(name).getLightde();
if(lighted){
System.out.println(vehicles.remove(0)+"通过了马路");
}
}
}
},
1,
1,
TimeUnit.SECONDS);//单位,表示每过一秒通过一倆车
}
}
然后描述一个灯类:灯可以变绿和变红方法,变绿车子行驶,变红车子停下。
每个方向的灯对应该方向行驶来的车辆。
package com.it7k;
//描述一个灯类,对应各个路线上的车俩
public enum Lamp {
//代表4条主线路的灯对象所行驶的车俩
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
//对应4条主线程的灯对象所行驶的车辆
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);
/**
*
* @param opposite 表示对应的灯
* @param next 表示下一个灯
* @param lighted 灯当前的状态
*/
private Lamp(String opposite,String next,boolean lighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
private Lamp(){}
//描述灯的状态
private boolean lighted;
//描述一个控制对应的灯的状态
private String opposite;
//下一个灯的状态
private String next;
//获取当前灯状态的方法
public boolean getLightde(){
return lighted;
}
//如果当前灯为绿,赋值为ture允许通过
public void green(){
this.lighted=true;
//判断是否有对应的灯,如果有,则让对应的灯也变绿
if(opposite!=null){
Lamp.valueOf(opposite).green();
}
//name()方法返回当前枚举对象名字
System.out.println(name()+"灯变绿了,"+"下面应该有6个放向能看到汽车穿过...");
}
//如果当前灯为红,赋值为false不允许通过
public Lamp red(){
this.lighted=false;
//判断是否有对应的灯,如果有,则让对应的灯也变红
if(opposite!=null){
Lamp.valueOf(opposite).red();
}
Lamp nextLamp=null;
if(next!=null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从"+name()+".....切换为.."+next);
nextLamp.green();
}
//返回下一个灯的状态
return nextLamp;
}
}
描述一个控制器,控制灯切换的功能。
package com.it7k;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class KzLamp {
private Lamp nowLamp;//当前的灯
public KzLamp(){
//让第一个线路的灯等于当前的灯
this.nowLamp=Lamp.S2N;
nowLamp.green();//变绿
open();
}
//让当前的灯在定时器规定的时间变化,开启交通灯
public synchronized void open(){
ScheduledExecutorService ss = Executors.newScheduledThreadPool(1);
ss.scheduleAtFixedRate(
new Runnable(){
public void run(){//当前线程执行的任务
nowLamp=nowLamp.red();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
调用主程序,测试该功能...
package com.it7k;
public class MainClass {
public static void main(String[] args) {
String[] arr = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
for(int i = 0;i<arr.length;i++){
new Road(arr[i]);
}
new KzLamp();//启动灯控制器
}
}
交通管理分析思路图:
------- android培训、java培训、期待与您交流! ----------