21 交通灯管理系统

面向对象的设计

1. 面向对象设计的诀窍:谁拥有数据,谁就对外提供操作这些数据的方法。

2. 面向对象设计的心得:对题目的透彻分析与理解很重要,对于题目要求实现的过程与功能,最好可以先把事情的流程使用画图的方式体现出来,再根据流程进行面向对象的分析。

3. 面向对象设计的一些小例子

1球沿着绳子移动

Ball  Rope move()

class Rope{

private Point pStart;

private Point pEnd;

Public Rope(Point pStart, Point pEnd){

this.pStart = pStart;

this.pEnd = pEnd;

}

public Point nextPoint(Point currentPoint){

/*通过两点一线的数学公式可以计算出当前点的下一个点,这个细节不属于设计阶段要考虑的问题,如果当前点是终点,则返回null, 如果当前点不是线上的点则抛出异常*/

}

}

class Ball{

private Rope rope;

private Point currentPoint ;

public Ball(Rope rope, Point startPoint){

This.rope = rope;

this.currentPoint = startPoint;

}

public void move(){

currentPoint = rope.nextPoint(currentPoint);

System.out.println("小球移动到了:" + currentPoint);

}

}

2石头磨成石刀,石刀砍树,砍成木材,木材可以做成椅子

Knife  knife = KnifeFactory.makeKnife(Stone stone)

Stone

Material material = Knife.cut(Tree tree)

Knife

Tree

Material

Chair chari = ChairFactory.makeChair(Material material)

Chair

4. 遇到的问题:在测试时出现在10秒绿灯时间中有时没有一车辆通过,有时只有几辆通过。

原因:在Road类里模拟绿灯1秒钟开走一辆车的过程中,没有判断在此路线上是否有车,不管有没有车,都检查一遍此线路的灯是否为绿灯,没车的时候也占用了时间。

解决办法:先进行判断此路线上是否有车,即集合中是否有元素,有才能把车开走,把元素移去,没有元素的时候,不用检查此线路的灯是否为绿灯。

出错的代码:

ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

boolean lighted = Lamp.valueOf(Road.this.name).isLighted();

if(lighted){

System.out.println(vechicles.remove(0) + " is traversing !");

}

}

},

1,

1,

TimeUnit.SECONDS);

修正后的代码:

ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

if(vechicles.size()>0){

boolean lighted = Lamp.valueOf(Road.this.name).isLighted();

if(lighted){

System.out.println(vechicles.remove(0) + " is traversing !");

}

}

}

},

1,

1,

TimeUnit.SECONDS);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值