您的位置:首页 > 职场人生

黑马程序员-交通灯管理系统

2013-03-11 14:00 330 查看
------- android培训java培训、期待与您交流! ----------

面向对象的关键:谁拥有数据,谁就对外提供这个数据的操作方法。
面向对象练习:两块石头磨成一把刀,石刀可以砍树,砍成木材,木材可以坐成椅子。
有一个石刀加工厂,一把石刀需要两块石头,石刀有个砍树的方法,返回木材,需要传入树木,又有一个椅子工厂,有一个制造椅子的方法需要传入木材返回椅子。



一共有12条路,E2W,E2S,E2N,
      S2N,S2W,S2E,
       W2E,W2N,W2S,
      N2S,N2E,N2W
其中右拐弯的被假设为常绿状态,E2N,N2W,W2S,S2E不用考虑,还剩下八条线,这八条线中有4组是两两对应的,也就是说只用考虑4条线,只考虑图中标了数字的4条线,
E2W东向西,E2S东向南(W2E和W2N是相同的操作)
S2N南向北,S2W南向西(N2S,N2E是相同操作)
需要:

灯有12个是不变的,用枚举。

lamp类:

  让绿灯亮,对面灯也亮

  让当前绿灯灭,下一个绿灯亮
路线
road类:
  不定时的在路上添加车
  每隔1s取走一辆车,集合中第一个。也就相当于路口排队等红绿灯的,等到绿灯开走一辆,开走的自然是排在最前面的一辆了,而开走需要时间,定为1s一辆。

灯的控制器
lampcontroller类:
  有一个当前灯
  先让南边的走
  每隔10s让当前绿灯灭,下一个灯绿
监控
monitoring类:
  一个集合
  添加通行的路口
  查看全部通行路口
  清空集合
main类:
  创建12条路,
  启动系统

package itcast.interview;

/**
* 交通灯类,负责熄灭绿灯,开启绿灯
* @author Administrator
*
*/
public enum Lamp {
//只用对E2W东向西,E2S东向南,S2N南向北,S2W南向西进行控制
//这4个灯为常绿
//这里不能直接传入方向灯,
//因为总有传入的没有被创建出来
//只能传入字符串,然后通过枚举valueOf方法返回枚举
E2W("W2E","E2S",false),E2S("W2N","S2N",false),E2N(null,null,true),
S2N("N2S","S2W",false),S2W("N2E","E2W",false),S2E(null,null,true),

W2E(null,null,false),W2N(null,null,false),	W2S(null,null,true),
N2S(null,null,false),N2E(null,null,false),	N2W(null,null,true);

//当是否为绿灯亮,true为绿灯亮
private boolean lighted;
//对面方向的灯
private String opposite;
//下一个灯
private String next;

private Lamp(String opposite, String next, boolean lighted){
this.lighted = lighted;
this.opposite = opposite;
this.next = next;
}
public void light(){
System.out.println("kuangjin");
//让当前路的绿灯亮
this.lighted=true;
//让对面的绿灯也亮,但是只有那4条线路有权力
if(opposite != null){
Lamp.valueOf(opposite).light();
}
}
public Lamp blackOut(){
//灭掉当前路的绿灯,相当于让红灯亮起,绿灯熄。
this.lighted = false;
//灭掉对面的绿灯,也是只有那4条线路有这个权力
if(opposite != null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp = null;
//让下一个路线的绿灯亮
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println(this.name() + "路红灯亮起," + nextLamp + "路绿灯亮起");
nextLamp.light();
}
return nextLamp;
}
public boolean isLighted(){
return this.lighted;
}
}


package itcast.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 {

private List<String> vechicles = new ArrayList<String>();
private String name;
public Road(String name){
this.name = name;
//不定时的添加车辆需要时间,不能让创建对象一直等,所有专门弄一个线程
ExecutorService thread = Executors.newSingleThreadExecutor();
thread.execute(new Runnable(){
@Override
public void run() {
//不定时的添加车辆
for(int i = 0; i < 1000; i++){
try {
Thread.sleep((new Random().nextInt(10) + 1) *1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name + "_" + i);
}
}
});

//每隔1s看一下这条路的绿灯是否是亮的,是就走一辆扯。
ScheduledExecutorService timerThread = Executors.newScheduledThreadPool(1);
timerThread.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//判断路上是否有车
if(vechicles.size() > 0){
//判断当前路是否是绿灯亮起
if(Lamp.valueOf(Road.this.name).isLighted()){
//把当前通行的路口存入监控类
Monitoring.addLamp(Road.this.name);
//每次都是删除第一辆车
System.out.println(vechicles.remove(0) + " 过路口了");
}
}
}
}, 1, 1, TimeUnit.SECONDS);
}

}


package itcast.interview;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 交通灯控制类,负责每隔一段时间切换交通灯
* @author Administrator
*
*/
public class LampController {
private Lamp currentLamp;
public LampController(){
//先从东向西线路绿灯亮
currentLamp = Lamp.E2W;
currentLamp.light();

//每隔10s换一条路线,让当前路线红灯亮起,下一个路线绿灯亮起
ScheduledExecutorService timerThread = Executors.newScheduledThreadPool(1);
timerThread.scheduleAtFixedRate(new Runnable() {

@Override
public void run() {
//查看这10s内有哪些路口通行过
Monitoring.findByLamList();
//清空监控类集合
Monitoring.clearLampList();
//切换路线,获取当前绿灯路线
currentLamp = currentLamp.blackOut();
System.out.println(currentLamp);
}
},10, 10, TimeUnit.SECONDS);
}
}


package itcast.interview;

import java.util.TreeSet;

/**
* 监控在一段时间内有哪些路口通行。
* @author Administrator
*
*/

public class Monitoring {
private static TreeSet<String> treeset = new TreeSet<String>();
//添加通行路口
public static void addLamp(String lamp){
treeset.add(lamp);
}
//打印全部通行的路口
public static void findByLamList(){
StringBuilder sb = new StringBuilder("这段时间通行的路线有:");
for(String str : treeset){
sb.append(str + ", ");
}
sb.delete(sb.length() - 2, sb.length());
System.out.println(sb.toString());
}
//清空集合
public static void clearLampList(){
treeset.clear();
}
}


package itcast.interview;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] directions = {"E2W","E2S","E2N",
"S2N","S2W","S2E",
"W2E","W2N","W2S",
"N2S","N2E","N2W"};
//产生12条路线
for(int i = 0; i < directions.length; i++){
new Road(directions[i]);
}

//启动交通灯系统
new LampController();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: