黑马程序员-交通灯管理系统
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条路,
启动系统
面向对象的关键:谁拥有数据,谁就对外提供这个数据的操作方法。
面向对象练习:两块石头磨成一把刀,石刀可以砍树,砍成木材,木材可以坐成椅子。
有一个石刀加工厂,一把石刀需要两块石头,石刀有个砍树的方法,返回木材,需要传入树木,又有一个椅子工厂,有一个制造椅子的方法需要传入木材返回椅子。
一共有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(); } }
相关文章推荐
- 黑马程序员_7K月薪面试题破解之一_交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员Java -- 交通灯管理系统案总结
- 黑马程序员 交通灯管理系统的分析与理解
- 黑马程序员_交通灯管理系统
- 【黑马程序员】交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员_交通灯管理系统笔记
- 黑马程序员----交通灯管理系统
- 黑马程序员23.交通灯管理系统
- 黑马程序员_7k面试_交通灯管理系统
- 黑马程序员---交通灯管理系统
- 黑马程序员_java_基础加强_模拟交通灯管理系统
- 【黑马程序员】交通灯管理系统_学习笔记
- 【黑马程序员】交通灯管理系统
- 黑马程序员——交通灯管理系统
- 黑马程序员—(JAVA)交通灯管理系统
- 黑马程序员-Java基础学习之交通灯管理系统
- 黑马程序员——交通灯管理系统