------- android培训、java培训、期待与您交流! ----------
1、需求分析:
在一个路口中行驶的线路会有12条,而在这12条的线路中有4条的线路上的车是自由行驶的。也就是向右转向的车
设计时可以设计为常态。不必去考虑其他的问题,而剩下的8条线路就形成了4组也就是“南北直行”,“南到西”,
“北到东”,“东西直行”,“东到南”,“西到北”。这样的四组线路。
2、分析和设计:
初步的设想应该为4个对象。汽车,灯,灯控制器,路。因为不需要出车子的移动过程,值是通过路口的那一时刻
所以只需要3个对象,灯 灯的控制器 和路。
在路的这个对象中有增加车辆的方法和减少车辆的方法。
面向对象设计的重要经验:谁拥有数据谁就对外提供操作这些数据的方法。
在设计灯的类的时候值需要设计四组灯的逻辑即可,因为有另外的四组灯是与这四组灯是相反的
而另外的四组灯设计为常亮的状态的。所以在设计灯的类的时候就要使用到了枚举,用枚举来设计这
四组灯的对象。在灯的属性上只有三个属性:相反方向的灯,下一个方向的灯,和灯的点亮状态
3、根据上面的设计来编写出代码:
Road.java这个类:
其中有两个方法是增加路上的车,和路上的车消失
用到了两种的方法
增加路上的车是用的线程的方法:
ExecutorService pool = Executors.newFixedThreadPool(1);//这是一个线程池的概念
pool.execute(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<100;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vechicles.add(Road.this.name+"_"+i);
}
}});
路上消失的车需要用到了定时器,去定时的让路上的车消失
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run(){
boolean ligther = Lamp.valueOf(Road.this.name).isLigthed();
if(ligther){
System.out.println(vechicles.remove(0)+"is traversing !");
}
}
},
1,//每个多少秒让车消失
1,
TimeUnit.SECONDS);
来定义灯的类:其中使用到了枚举:每一个灯就是一个对象,而每一对象中都有三个属性
public enum Lamp {
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",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 lighted; //灯亮的属性
private String opposite; //相对灯的属性
private String next; //下一个灯的属性
灯亮的方法:
public void light(){
this.lighted = true;
if(opposite!=null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}
灯灭的方法:
public Lamp blackOut(){
this.lighted = false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
下一个灯亮的方法:
Lamp nextLamp = null;
if(next!=null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
定义灯的控制器的类:其中也使用到了定义器。没隔10秒钟一变
control = Lamp.S2N;
control.light();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run(){
control = control.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
然后再写一个测试的类:
一起初始化那12个方向的对象
String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E",
"W2N","S2E","E2N","N2W","W2S"};
for(int i=0;i<directions.length;i++){
new Road(directions[i]);
}
new LampControl();//实例化灯控制器的类