面向对象的设计
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);