android培训、java培训、期待与您交流!
(黑马程序员)交通灯系统
设计需求;模拟现实十字路口交通灯管理逻辑,具体需求如下:
a、 异步随机生成按照各个路线行驶的车辆。
b、 信号灯忽略黄灯,仅考虑绿红;
c、 右转灯不受信号灯控制;
d、 南北向车辆和东西向车辆交替放行,同方向等待车辆应先放行直行车辆再放行左传车辆;
e、 每辆车通行时间为1秒(通过线程sleep方式模拟);
f、 随机生成车辆和时间间隔以及红绿灯交换时间间隔自定,可以设置;
g、 不要求实现GUI,仅考虑逻辑实现,可以通过log方式展现效果。
分析图例:
设计需求简化(分析时一定使用图形):
a、 在十字路口四个方向,四个路口中,每个路口除自己方向外还应该有3个方向可去,故共12条路线,给每条路线虚拟一个指示灯,向右的3条路线可以看成常绿;
b、 灯的状态仅两种状态就用boolean两种状态表示;
c、 除去4个右转常绿的应考虑8条线路,8条线路中分成4组N2S,S2N;E2W,W2E;(前面两组对开)N2E,S2W;E2S,W2N(这两组互为犄角)。这4组中每组都是同开同灭;
d、 8条路,每条路自己内部自动产生车辆,公用一个控制器控制。
面向对象设计通用思想:
a、 拥有数据谁就提供操作数据的方法。例子,售货员在统计售货票据上的金额:数据依附于票据上,售货员这个对象调用了售货票据对象的getTotalMoney()的方法,getTotalMoney()方法内部计算出票据的总金额。
b、 如果把自己变成另外一种对象(而且自己本身没了)一定是第三方对象具有一个方法将此对象变成另外一个对象。例子,两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”,石头自己没了成了一把石刀,StoneKnife sf = KnifeFactory.createKnife(Stone s1,Stone s2),树成了木材,Mateial m = StoneKnife.cut(Tree t),木材成了椅子Chair ch = ChairFactory.makeChair(Mateial m);
c、 注意知识点:
1. 枚举类型只有在枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用。枚举类型的构造方法必须是私有的。
Lamp.valueof(opposite)//枚举中的静态方法,给一个对象名,返回这个对象名相应的对象
2. 定时器code:
//定义一个计时器,newScheduledThreadPool(1)创建一个线程池并抽取1个线程处理业务
ScheduleExecutorService timer = Executors.newScheduledThreadPool(1);
//定时器处理业务方式一,延迟多久处理,其中:command—处理的具体业务代码,一般为Runnable对象;delay--是int值过多久处理,注意,仅仅处理一次;unit—说明前面时间int的度量单位是秒豪秒等等。
timer.schedule ( code command,int delay,unit);
//定时器处理业务方式一的实例,
timer.schedule (
new Runnable(){},/*new一个线程*/
delay,
unit)
//定时器处理业务方式二,固定频率多次处理,其中:command,initialDelay—多久以后首次处理,period—隔多久再次处理,unit。
Timer.scheduleAtFixedRate(command,initialDelay,period,unit);
//定时器处理业务方式二的实例。
Timer.scheduleAtFixedRate(
new Runnable(){
pulic void run(){
if(verchicles.size()>0){
boolean lighted = true;
if(lighted){
System.out.println(vechicles.remove(0)+”traversing”);
}
}
}
},
1,
1,
TimeUnit.SECONDS)
4.内部类要访问外部类的局部变量,必须将外部类的局部变量设成final;如果访问外部类的成员变量可以直接引用,但是如果外部类的成员变量名跟内部类名称冲突,则需要“外部类名.this.引用变量名”
pubic class Road{
Private List<String> vechicles = new ArrayList<String>;
private Road(String name){//1 (fianl String name)添加final让被访问
this.name = name;
ExecutorService pool = Executors.newSingleThreadExecutor();//线程池。
pool.execute(
new Runnable(){//这是一个内部类,并且new的是Rnnable的子类实体
pubic void run(){
for(int i = 1;i<1000;i++){
Thread.sleep(1000);
//Vechicles.add(name+”_”+i);//1访问外部局部变量
//Vechicles.add(Road.this.name+”_”+i);
}
}
})
}
}
---------------------- android培训、java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima