看了张老师的《破解交通灯管理系统》的视频,收获良多:
1、了解了面向对象的设计方法,运用面向对象思想设计程序时,一个核心的要领是“谁拥有数据,谁就对外提供操作这些数据的方法”;
2、通过学习项目,体验到编程除了知识和技术之外,还有另外一个维度:对各类知识和技术的整合;
3、枚举在开发中的应用;
4、线程池的使用。
在理解了老师讲解的基础上,自己对问题又重新做了一番思考,产生了一个疑问:在交通灯管理系统中使用了多线程,也有共享数据,但老师并没有使用同步,我想可能是因为对于交通灯亮与灭的几十秒,程序内部因为没有同步产生的几微秒的误差是可以忽略不计的。
同时在学习老师的代码的过程中发现可以对Lamp类进行一些简化:处于对称位置的两条行车路线可以共享同一个交通灯,例如南向北和北向南可以共享一个直行交通灯,所以对于12条行车路线只需要由6盏交通灯进行控制。重新设计过的Lamp类如下:
public enum Lamp {
X_STRAIGHT("X_LEFT",10_000), // 南北方向上的 直行 交通灯
X_LEFT("Y_STRAIGHT",8_000), // 南北方向上的 左转 交通灯
Y_STRAIGHT("Y_LEFT",10_000), // 东西方向上的 直行 交通灯
Y_LEFT("X_STRAIGHT",8_000), // 东西方向上的 左转 交通灯
X_RIGHT,Y_RIGHT; // 右转交通灯
private String nextLamp; // 后继交通灯
private boolean lighted; // 交通灯的状态
private int time; // 交通灯持续明亮的毫秒数,控制器据此设定灯亮的长短
Lamp(String nextLamp, int time) {
this.time = time;
this.nextLamp = nextLamp;
}
Lamp() {
this(null,0);
}
// 开灯
public void turnOn() {
lighted = true;
}
// 关灯
public void turnOff() {
lighted = false;
}
// 判断灯的状态
public boolean isLighted() {
return lighted;
}
// 获取后继交通灯
public Lamp nextLamp() {
return Lamp.valueOf(nextLamp);
}
// 获取交通灯持续明亮的时间
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
学习项目给人一种与学习知识截然不同的体验,它一会儿要求人深入细节去实现具体功能,一会儿要求人跳出细节进行全局地把握。对于一个没有开发经验的新人,学习项目能让人对程序开发有一个更全面的了解,更能从牛人的代码中、老师的讲解中学到许多超越知识的东西。写到这里想起在黑马的课程中安排了许多大大小小的项目,不禁对未来有了更进一步的期待。