黑马程序员-Java交通灯管理系统
2014-04-18 16:49
309 查看
先画出图以便于分析问题:
![](http://img.blog.csdn.net/20130621124312375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTAzOTQxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
项目分析:
用面向对象的方式思考:项目中出现的对象分别有:路灯、路灯控制器、路。因为项目的侧重点是路灯,所以就把路上行驶的车看做是路的一个属性,并且路会根据路灯确定是否让车子前进,路还有向自己增加车子的方法。
具体要写代码的思路:
1、路灯
首先“路灯”因该是一个枚举类型,因为此项目中有12条不同的路,每条路上都要有一个路灯,所以路灯的实例因该只有12个。用面向对象的方式思考:谁拥有数据谁就应该提供操作这些数据的方法,则路灯因该有控制自己变红和变绿的方法,而且还要有向外部提供自己现在是红灯还是绿灯的方法。
2、路灯控制器
顾名思义,路灯控制器就因该控制路灯的变化,当new出一个路灯控制器的实例时它就因该不停的工作,所以它因该创建一个新线程,又因为路灯的变化是一个有规律的死循环,则考虑到用一个有频率的定时器来实现这个功能。
3、路
分析可知一共有12条不同的路线,所以路对象因该只创建12个不同的实例。路还因该有一个集合类,用来保存路上的车。路还因该有一个方法用来管理路上的车能否通过十字路口,路还因该有一个向自己添加车辆的方法。而且这两个方法都因该是一个单独的线程在运行,并且是在路创建的时候就开始运行了,所以在路的构造方法中因该创建了两个线程来执行这两个不同的方法。
下面是这个项目的代码实现:
1、路灯的代码:
[java] view
plaincopy
package com.hbsi.interview.traffic;
public enum Lamp {
//因为路灯间是有逻辑关系的,所以只控制这四个灯,其他的灯就都能够确定是什么状态了
S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",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 Boolean condition;
private String next;
private String equal;
private Lamp(String next,String equal,Boolean condition){
this.next = next;
this.equal = equal;
this.condition = condition;
}
public Boolean isLighted(){
return condition;
}
//让灯变成绿灯的方法
public void light(){
condition = true;
if(equal!=null){
Lamp equalLamp = Lamp.valueOf(equal);
equalLamp.light();
System.out.println(this+" Lamp is green,会有六个方向通车");
System.out.println(equalLamp+" Lamp is green,会有六个方向通车");
}
}
//让灯变成红灯的方法
public Lamp blackOut(){
this.condition = false;
Lamp nextLamp = null;
if(equal!=null){
Lamp.valueOf(equal).blackOut();
}
if(next != null){
nextLamp = Lamp.valueOf(next);
nextLamp.light();
}
return nextLamp;
}
}
2、路灯控制器的代码:
[java] view
plaincopy
package com.hbsi.interview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp;
//灯的控制器其实就是一个定时器,他会根据逻辑判断哪个路上现在因该是绿灯,这个绿灯要亮多久
public LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();
Boolean roadLamp = Lamp.valueOf("S2N").isLighted();
ScheduledExecutorService tmer = Executors.newScheduledThreadPool(1);
tmer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
3、路的代码:
[java] view
plaincopy
package com.hbsi.interview.traffic;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
private String name;
private List<String> interview = new ArrayList<String>();
public Road( String name){
this.name = name;
//在创建Road的同时,向路上添加车
ExecutorService pool= Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
@Override
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);//路添加车辆的速率会有所不同
} catch (InterruptedException e) {
e.printStackTrace();
}
interview.add(Road.this.name+"_"+i);
//System.out.println(Road.this.name+"添加第"+i+"辆车");
}
}
});
//路创建后因该不断的判断自己路上的车能不能通过路口
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run(){
if(interview.size()!=0){
Boolean roadLamp = Lamp.valueOf(Road.this.name).isLighted();
if(roadLamp){
System.out.println( interview.remove(0));
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
项目分析:
用面向对象的方式思考:项目中出现的对象分别有:路灯、路灯控制器、路。因为项目的侧重点是路灯,所以就把路上行驶的车看做是路的一个属性,并且路会根据路灯确定是否让车子前进,路还有向自己增加车子的方法。
具体要写代码的思路:
1、路灯
首先“路灯”因该是一个枚举类型,因为此项目中有12条不同的路,每条路上都要有一个路灯,所以路灯的实例因该只有12个。用面向对象的方式思考:谁拥有数据谁就应该提供操作这些数据的方法,则路灯因该有控制自己变红和变绿的方法,而且还要有向外部提供自己现在是红灯还是绿灯的方法。
2、路灯控制器
顾名思义,路灯控制器就因该控制路灯的变化,当new出一个路灯控制器的实例时它就因该不停的工作,所以它因该创建一个新线程,又因为路灯的变化是一个有规律的死循环,则考虑到用一个有频率的定时器来实现这个功能。
3、路
分析可知一共有12条不同的路线,所以路对象因该只创建12个不同的实例。路还因该有一个集合类,用来保存路上的车。路还因该有一个方法用来管理路上的车能否通过十字路口,路还因该有一个向自己添加车辆的方法。而且这两个方法都因该是一个单独的线程在运行,并且是在路创建的时候就开始运行了,所以在路的构造方法中因该创建了两个线程来执行这两个不同的方法。
下面是这个项目的代码实现:
1、路灯的代码:
[java] view
plaincopy
package com.hbsi.interview.traffic;
public enum Lamp {
//因为路灯间是有逻辑关系的,所以只控制这四个灯,其他的灯就都能够确定是什么状态了
S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",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 Boolean condition;
private String next;
private String equal;
private Lamp(String next,String equal,Boolean condition){
this.next = next;
this.equal = equal;
this.condition = condition;
}
public Boolean isLighted(){
return condition;
}
//让灯变成绿灯的方法
public void light(){
condition = true;
if(equal!=null){
Lamp equalLamp = Lamp.valueOf(equal);
equalLamp.light();
System.out.println(this+" Lamp is green,会有六个方向通车");
System.out.println(equalLamp+" Lamp is green,会有六个方向通车");
}
}
//让灯变成红灯的方法
public Lamp blackOut(){
this.condition = false;
Lamp nextLamp = null;
if(equal!=null){
Lamp.valueOf(equal).blackOut();
}
if(next != null){
nextLamp = Lamp.valueOf(next);
nextLamp.light();
}
return nextLamp;
}
}
2、路灯控制器的代码:
[java] view
plaincopy
package com.hbsi.interview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp;
//灯的控制器其实就是一个定时器,他会根据逻辑判断哪个路上现在因该是绿灯,这个绿灯要亮多久
public LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();
Boolean roadLamp = Lamp.valueOf("S2N").isLighted();
ScheduledExecutorService tmer = Executors.newScheduledThreadPool(1);
tmer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
3、路的代码:
[java] view
plaincopy
package com.hbsi.interview.traffic;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
private String name;
private List<String> interview = new ArrayList<String>();
public Road( String name){
this.name = name;
//在创建Road的同时,向路上添加车
ExecutorService pool= Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
@Override
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);//路添加车辆的速率会有所不同
} catch (InterruptedException e) {
e.printStackTrace();
}
interview.add(Road.this.name+"_"+i);
//System.out.println(Road.this.name+"添加第"+i+"辆车");
}
}
});
//路创建后因该不断的判断自己路上的车能不能通过路口
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run(){
if(interview.size()!=0){
Boolean roadLamp = Lamp.valueOf(Road.this.name).isLighted();
if(roadLamp){
System.out.println( interview.remove(0));
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
相关文章推荐
- 黑马程序员——【Java高新技术】——案例:交通灯管理系统
- 黑马程序员_java进阶之面试题:模拟交通灯管理系统
- 黑马程序员:Java编程_7K面试题之交通灯管理系统
- 黑马程序员_Java学习日记27_交通灯管理系统
- 黑马程序员 java基础加强之交通灯管理系统
- 黑马程序员----java编程之交通灯管理系统
- 黑马程序员 - Java 面试题破解 交通灯管理系统
- 黑马程序员_王康 java实现交通灯管理系统
- 黑马程序员_java基础笔记(14)...交通灯管理系统_编码思路及代码
- 黑马程序员——java 7K交通灯管理系统笔记
- 黑马程序员之Java基础加强之交通灯管理系统
- 黑马程序员 java提高——张孝详交通灯管理系统
- 黑马程序员——Java面试题交通灯管理系统
- 黑马程序员_java之交通灯管理系统(很重要)
- 黑马程序员_java学习日记_交通灯管理系统
- 黑马程序员----------java7K面试题之交通灯管理系统
- 黑马程序员——java基础---交通灯管理系统
- 黑马程序员——Java交通灯管理系统&银行业务系统
- 黑马程序员---交通灯管理系统【java】
- 黑马程序员Java -- 交通灯管理系统案总结