---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
用面向对象的思想设计交通灯管理系统,首先要明确对象是什么.张老师有几个面向对象的经典例子,在这里,我也将它例举出来.
1.人在黑板上画圆:圆才是画这个方法的对象,因为画出圆需要半径和圆心,这些数据只在圆上拥有
2.人关门,关门这个动作的对象是门上的,因为门拥有门轴,门栓等资源
3.列车司机刹车,刹车这个动作的对象是列车,因为列车拥有刹车闸.
总之,谁拥有数据,谁就有对外提供操作这些数据的方法.
放到这个系统中分析,我们可以找到几个对象分别是红绿灯,红绿灯的控制系统和路,因为路拥有车,它提供的是车辆增加和减少的方法
从这三个对象入手,可以分解出整个系统的思路.
一.创建灯
一个路口有4个方向,每个方向有3种选择,因此总共有12条路,即有12展灯.向右转的4个方向没有灯,为保持系统的一致性,将它假定为常绿灯.其余8展互对的为一组,即分成4组,因为互对的灯是一样颜色的,因此只将一面的灯作为控制灯.当设定一个灯为绿灯时,对面的灯也是绿灯,旁边的灯则转为红灯,代码如下:
package net.csdn.interview;
/**
*
* 因为有12个固定的灯,所以用枚举来写灯
*
*/
public enum Lamp {
//通过画图得到方向
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2E","N2N",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 oppsition, String nex,boolean lighted) {
this.oppsition = oppsition;
this.lighted = lighted;
this.next = next;
}
private Lamp(){}
private boolean lighted;//定义亮着的就是绿灯
private String oppsition;// 定义对面的灯
private String next;
public boolean isLighted(){ //判断是否为绿灯
return lighted;
}
public void light(){ //灯提供一个变亮的方法
this.lighted = true;
if (oppsition!=null) {
Lamp.valueOf(oppsition).light(); //用枚举的方法将对面的灯变亮
}
if (next!=null) {
Lamp.valueOf(next).blackLight(); //让下一个灯变黑
}
}
public Lamp blackLight(){ //灯提供一个变黑的方法
this.lighted = false;
if (oppsition!=null) { //没明白
Lamp.valueOf(oppsition).blackLight();
}
Lamp nextLamp = Lamp.valueOf(next);
if (next!=null) { //没明白
nextLamp.light(); //下一个灯变亮
}
return nextLamp;
}
}
二.创建路
路上有增加和减少车辆的方法,增加车辆实在1-10秒内随机的产生车辆数目,减少则是根据灯是否为亮这个判断条件,里面用到了线程池的概念,具体代码如下:
package net.csdn.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;
/**
*
* 创建路的类,路上有增加和删除车的方法
* 里面用到了线程池的概念
*
*/
public class Road {
List vechicles = new ArrayList();
private String name;
public Road() {
super();
}
public Road(String name) {
this.name = name; //以方向命名
ExecutorService pool = Executors.newSingleThreadExecutor(); //创建一个使用单个 worker线程的 线程池
pool.execute(new Runnable(){ //开线程
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
try {
Thread.sleep(new Random().nextInt(10)+1*1000); //1到10秒内会随机出现一辆车
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name+"第"+i+"辆车"); //把车添加到路上
}
}
});
//当绿灯两时,要将车从马路上移除,自定义时间为1秒
//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
ScheduledExecutorService ses= Executors.newScheduledThreadPool(1);
ses.scheduleAtFixedRate(new Runnable(){
@Override
public void run() { //每隔一秒移除一辆车,并且是循环的移
if (vechicles.size()>0) {//判断路上有车
boolean light = Lamp.valueOf(Road.this.name).isLighted();//设定等是绿的,车可过行
if (light) {
vechicles.remove(0);//把车从路上移走
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
三.创建灯的控制器
先记录一盏灯,给它设定亮的时间是10秒,之后让当前的灯变黑,返回下一个灯,让下一个灯变绿,这是就需要对灯那个类做出一点修改,把变黑的方法改成返回下一个灯.代码如下:
package net.csdn.interview;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*
* 定义一个灯的控制器,让它每隔10秒变一次
*
*/
public class LampController {
private Lamp currentLamp; //定义一个当前的灯
public LampController(){
currentLamp = Lamp.S2N; //记录一盏灯作为当前灯
Lamp.valueOf("S2N").light(); //把当前灯点亮
//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses.scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
currentLamp = currentLamp.blackLight();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
最后测试代码
package net.csdn.interview;
public class Test {
public static void main(String[] args) {
String[] directions = new String[]{ //找到所有的灯
"S2N","S2W","E2W","E2S","N2S","N2E","W2N","W2N","S2E","E2N","N2W","W2S"
};
for (int i = 0; i < directions.length; i++) {
new Road(directions[i]); //把灯放在路上
}
new LampController(); //开启灯的控制器
}
}
总结:思路清晰后,代码不会特别难,关键还是面向对象的思想问题,要找到作用的是哪几个对象.灯的方位问题画图之后就很清晰了,但是有些特殊的地方还是要注意,代码还是不很熟练,
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------