一:面向对象的设计经验:谁拥有数据,谁就对外提供操作这些数据的方法。
对象分析:路、灯、控制器
1.路的分析:
经过分析一个十字路口一共有十二个方向的车流,而且可以分成是五种情况:南北向、东西向、南北左拐、东西左拐、右拐。。其中右拐不受交通灯控制。
路上有车(用一个集合表示,集合大小不确定,用随机数生成)
如果此路上的控制灯是绿灯则放行。
2.灯的分析:
是一个枚举类型,不允许随便声明其对象。
当它变红时,让下一个灯变绿。
public void Green(){
this.lighted=true;
if(brotherLamp!=null){
Lamp.valueOf(brotherLamp).Green();
}
}
public Lamp Red(){
this.lighted=false;
if(brotherLamp!=null){
Lamp.valueOf(brotherLamp).Red();
}
Lamp nextLamp = null; //这里一定要注意逻辑问题
if (nextGreanLamp!=null) {
nextLamp=Lamp.valueOf(nextGreanLamp);
nextLamp.Green();
System.out.println("下一个要亮的灯是:"+nextGreanLamp);
}
return nextLamp;
}
3.控制器的分析:
启动一个交通灯。
要每隔一段时间改变灯的颜色(是否允许通行)。
package com.itheima.preparation.traffic;
import java.util.concurrent.*;
public class LampController {
private Lamp nowLamp;
public LampController(){
System.out.println("交通灯控制系统已经启动!");
nowLamp=Lamp.S2N;
nowLamp.Green();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
nowLamp=nowLamp.Red();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
二:接口是不能直接new的,而在new之后添加一个大括号就是new的它的一个实现类!如:
ExecutorService pool = Executors.newSingleThreadExecutor();
Pool.execute(new Runnable(){
实现接口的方法。
});
三:内部类要使用外部类的局部变量,外部类的局部变量要加final;如果调用外部类的成员变量要用外部类的名字+this+变量名,如:Road.this.name。
写的不是很好,欢迎与您一起探讨!