一、 面向对象分析和设计
面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。
人在黑板上画圆:这个动作涉及到三个类,Person,blackboard,Circle画圆的方法draw()到底是哪个类中的方法呢?
画圆需要圆心坐标(x,y)和半径radius,这些数据在Circle类中上,所以Circle提供操作这些数据的方法draw();分析可得画圆的动作draw()是Circle提供的。
二、 用面向对象的方式设计如下情景:
1、两块石头磨成一把石刀,石刀可以砍树,树可以做成椅子。
Stone --> StoneKnife --> Tree -->Material --> Chair
//Stone不能自己提供一个方法把自己变成石刀,所以Stone需要被使用,需要工具:
StoneKnife =KnifeFactory.creatKnife(stone);
//StoneKnife自己有一个方法把Tree变成Material木材
Material = StoneKnife.cut(tree);
//Tree不能把自己变成一把Chair椅子,需要工具:
Chair = ChairFactory.makeChair(material)
2、球从一根绳子的一端移动到另一端:
Ball ,Rope两个对象似乎没有太大关系,仔细分析发现Ball本质是为Ball的移动提供一个方向(路线)。
由此可知:
Rope对象需要有获取当前点的下一个点的方法nextPoint(),同时Rope要有两个成员变量:起始点(start)、结束点(end)。
Ball要有一个move()移动的方法,方法内部rope调用next()方法返回当前点的下一个点再赋给当前点currentPoint。
所以,Ball要绑定Rope,Ball在构造的时候需要接收一个Rope对象和小球的当前点currentPoint,
代码示例描述小球和绳子:
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)
{
/* 通过两点一线的数学公式可以计算出当前点的下一个点,
这个细节不是设计阶段要考虑的问题,
如果当前点是终止点,则返回null,如果当前点不是线上的点,抛出异常。 */
}
}
class Ball
{
private Rope rope;
private Point currentPoint;
public Ball(Rope rope,Point start)
{
this.rope = rope;
this.currentPoint = start;
}
public void move()
{
currentPoint = rope.next(currentPoint);
System.out.println("小球移动到了"+currentPoint);
}
}