------- android培训、java培训、期待与您交流! ----------
在交通灯管理系统中,要模拟实现十字路口的交通管理系统逻辑,具体去求如下:
一 异步随机生成按照各个路线行驶的车辆。
例如:
由南而来往北去的车辆……直行车辆
由南而来往西去的车辆……左转车辆
由南而来往东区的车辆……右转车辆
二 信号灯忽略黄灯,只考虑红灯和绿灯。
三 只考虑直行车辆和左转车辆控制信号,右转车辆不受控制。
四 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
五 每辆车通过路口时间为一秒
六 随机生成车辆时间间隔,红绿灯交换时间自定。
七 不要求实现GUI,只考虑系统逻辑实现,可通过log方式展现程序运行结果。
画图非常有助于理解和分析项目的问题,所以一定要先画图理清楚思路。
1,通过画图可以看出一共存在12条路线,其中右转弯可以随时转,可以假设为
控制右转弯的灯一直是绿灯。剩下的八条路线是两两相对,所以只要考虑
图中标出的①②③④这四条路线的切换顺序即可
2,要用面向对象的思想分析项目中需要哪些对象。
张老师经验分享:谁拥有数据,谁就对外提供操作这些数据的方法。
①因为要获得每条路线上车辆的数据,所以要把路线看成拥有这些数据的 对象,所以要有一个描述路线的类,起名:Road
②车辆是走还是停要由灯的颜色来控制,所以颜色是灯的属性,灯要提供获取和改变颜色的方法,所以灯也是对象,起名:lamp
③灯的颜色是定时改变的所以要有灯的控制系统,来调用灯提供的方法定时改变灯的颜色。这些灯的控制系统属于一个系统
所以用单例设计模式。起名:LampController
实现该系统的重点是通过分析该路口车辆的所有可能路线,来组织涉及到的对象。由于本系统不涉及车辆对象的内部结构,所以只把他定义为了路线对象的成员属性。交通灯类的对象只有对应于12条路线的12个对象,所以可以把交通灯设计为枚举,再设计一个启动和控制交通灯的类。具体java代码如下:
package com.itheima.bbs.blog_9;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("初始化路线");
String[] roads = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N",
"S2E","E2N","N2W","W2S"};
for(int i = 0;i < roads.length;i++){
new Road(roads[i]);
}
System.out.println("开启系统");
LampController lampcontroller = new LampController();
lampcontroller.control();
}
}
package com.itheima.bbs.blog_9;
import java.util.*;
import java.util.concurrent.*;
public class Road {
private String name = new String();
private List<String> cars = new ArrayList<String>();
Road(String name){
this.name = name;
//模拟某条路线上开进来车辆的过程
ExecutorService executoeserver = Executors.newSingleThreadExecutor();
executoeserver.execute(new Runnable(){
@Override
public void run() {
for(int i = 1;i<15;i++){
try {
Thread.sleep((new Random().nextInt(10) + 1));
cars.add(Road.this.name+"路线上第"+i+"辆车");
System.out.println(Road.this.name + "路线上第" + i + "辆车"
+ "在等待绿灯");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
});
//每隔一秒查看灯的状态来控制车辆,如果为绿灯,则放行一辆车
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
if(cars.size() > 0){
if(Lamp.valueOf(Road.this.name).state == "GREEN"){
String removedcar = cars.remove(0);
System.out.println(removedcar + "驶过路口----------------------------------");
}
}
/*else
{
System.out.println(Road.this.name + "路线上没车在等绿灯");
}*/
}},
1,
1,
TimeUnit.SECONDS);
}
}
package com.itheima.bbs.blog_9;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentlamp;
LampController(){
this.currentlamp = Lamp.S2N;
}
void control(){
System.out.println(currentlamp+"、"+currentlamp.samestatelamp+"可以通行!");
currentlamp.setState("GREEN");
Lamp.valueOf(currentlamp.samestatelamp).setState("GREEN");
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
currentlamp.setState("RED");
Lamp.valueOf(currentlamp.samestatelamp).setState("RED");
currentlamp = Lamp.valueOf(currentlamp.nextlamp);
currentlamp.setState("GREEN");
Lamp.valueOf(currentlamp.samestatelamp).setState("GREEN");
System.out.println(currentlamp+"、"+currentlamp.samestatelamp+"可以通行!");
}
}, 1, 5, TimeUnit.SECONDS);
}
}
package com.itheima.bbs.blog_9;
public enum Lamp {
/*S2N(),S2W(),E2W(),E2S(),
N2S(),N2E(),W2E(),W2N(),
S2E(),E2N(),N2W(),W2S();*/
S2N("N2S","S2W"),S2W("N2E","E2W"),E2W("W2E","E2S"),E2S("W2N","S2N"),
N2S("S2N",null), N2E("S2W",null), W2E("E2W",null),W2N("E2S",null),
// 直走 左拐弯 直走 左拐弯
S2E(null,null),E2N(null,null),N2W(null,null),W2S(null,null);
// 右拐弯
String route;
String state;
String samestatelamp;
String nextlamp;
Lamp(String samestatelamp,String nextlamp){
this.samestatelamp = samestatelamp;
this.nextlamp = nextlamp;
}
public String getState() {
return state;
}
public void setState(String state){
this.state = state;
}
public String getSamestatelamp() {
return samestatelamp;
}
}
-------
android培训、
java培训、期待与您交流! ----------