---------------------- android培训、java培训、期待与您交流! ----------------------
在开始一个项目时,应该先把项目的设计方法和逻辑弄清楚,然后再开始项目开发。
其中面向对象设计的时候把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。
用面向对象的方式设计如下情景:“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”。先确定有几个对象并为对象命名:Stone、StoneKnife、tree、metrial、chair;然后对拥有数据的对象添加操作方法:
StoneKnife =KnifeFactory.createKnife(Stone first ,Stone second)
material= StoneKnife.cut(tree)
chair= ChariFactory.makeChair(metrial)
在本系统中我们初步设想一下有哪些对象:红绿灯,红绿灯的控制系统,汽车,路线。汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。
接着就是要弄清楚系统之间的逻辑问题:每个十字路口总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。当有时候逻辑太过复杂,可以考虑用模拟法或者画图来使问题更加明朗,有利于问题的解决。
在本项目中用了画图的方法对问题非常直观。
最后就是开发阶段了,先编写Road的类
publicclass Road {
//面向接口编程用List
//创建线程每条路线上随机增加新的车辆,增加到一个集合中保存
List<String>vechicles = new ArrayList<String>();
ExecutorService pool =Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(inti=1;i<1000;i++){
try {
//休息1-10秒
Thread.sleep((newRandom().nextInt(10)+1 )*1000);
} catch (InterruptedExceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
}
vechicles.add(Road.this.name+ "_" + i);
}
}
});
//创建定时器,每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public voidrun(){
//把第一辆车移走
if(vechicles.size()>0){
booleanlighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vechicles.remove(0)+ " is travering !");
}
}
}
},
1,
1,
TimeUnit.SECONDS/*时间单位*/);
}
}
public class Lampcontroller {
private Lamp currentLamp;
//整个系统中只能有一套交通灯控制系统,所以,LampController类设计成单例
public Lampcontroller(){
currentLamp = Lamp.S2E;
currentLamp.light();
//LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
ScheduledExecutorServicetimer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
//每隔10秒钟执行当前语句秒钟
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima