一、面向对象设计经验
面向对象设计经验:谁有数据,谁就提供操作数据的方法。
二、例子体现
1.用面向对象的思想设计:石头磨成石刀,石刀可以砍树,树变成木材,木材做成椅子。
分析:
涉及对象:石头Stone, 石刀StoneKnife,树Tree,木材Wood,椅子Chair
1)石头磨成石刀。石头(数据)不能自己磨成石刀,否则自己就没有了。
可以创建新的类KnifeFactory,并在类中定义方法,接收石头,然后返回石刀
StoneKnife = KnifeFactory.creatKnife(stone);
2)石刀砍树。树变成木材
wood = Stone.cut(tree);
3)木材做成椅子。
木材不能自己变成椅子。所以也需要另外的类来操作木材。
chair = ChairFactory.makeChair(wood);
2.人在黑板上画圆
对象:人,黑板,圆
画圆,需要知道圆心,半径,这些数据是“圆”这个对象所拥有。
所以,画圆这个动作,是由圆来操作数据而得的。
3.司机要刹车
对象:司机,车
刹车这个动作是在车上执行的,司机只是负责给车这个信号,最后还是由车来执行刹车动作。
所以刹车这个方法定义在车对象中。
4.售货员统计票据上的总金额。
对象:售货员。票据
金额这个数据是票据所拥有的, 所以统计这个方法应该定义在票据中。
三、应用案例
需求:用面向对象的思想实现:小球从绳子的一端移动到了另一端。
分析:有两个对象,绳子,小球。
绳子:1.绳子要初始化长度,构造方法要接收两个参数:起点和终点。
2.要创建一个方法,让小球根据当前位置获取下一步该走到的位置。
绳子有数据,所以绳子要提供这样一个方法来操作位置的数据。
小球:1.小球要和绳子关联在一起,所以要将绳子对象传入小球的构造函数,还要获取当前位置。
2.小球要移动,得有方法控制小球。绳子告诉它要运动到哪儿,它就执行移动的方法。代码实现
1.Ball类
<span style="font-size:18px;">import java.awt.Point;
//小球
public class Ball {
private Rope rope;
private Point currentPoint;
public Ball(Rope rope,Point currentPoint){
this.currentPoint = currentPoint;
this.rope = rope;
}
public void move() {
currentPoint = rope.nextPoint(currentPoint);
System.out.println("小球移动到了" + currentPoint);
}
}
</span>
2.Rope类
<span style="font-size:18px;">import java.awt.Point;
//绳子对象
public class Rope {
//起始端和终端
private Point start;
private Point end;
//定义绳子的起点和终点
public Rope(Point start,Point end) {
this.start = start;
this.end = end;
}
public Point nextPoint(Point currentPoint) {
Point nextPoint = null;
/*通过两点一线的数学公式可以计算出当前点的下一个点,如果当前点是终点,则返回null。
如果当前点不是线上的点,则抛出异常。*/
return nextPoint;
}
}</span>