----------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------
再谈面向对象
面向对象设计把握一个重要的经验:
谁拥有数据,谁就对外提供操作这些数据的方法。
几个经典并且重要的案例分析:
一:黑板上画圆,
画圆,要用到的圆的半径和圆心,这两个数据是由圆拥有的,所以画圆的方法
应该定义在圆上。
二:列车司机紧急刹车,
刹车,是车自身一系列的动作将车刹住,列车司机只不过拿到对象,调用了对
象的刹车方法,刹车的一系列数据是由列车所拥有,所以列车应提供刹车的方法。
三:售货员统计收获小票的金额,
统计小票金额,用到了小票身上的各项资金数据,所以小票应提供统计金额的
方法。
四:你把门关上了等。
关门:需要调用门轴转动,折页打开,锁舌关闭,这些数据被门所拥有,所以
门应该提供这些方法。
学员的两个面向对象的面试题,用面向对象的方式设计如下情景。
(1)“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”,
有哪些显式对象:Stone、Stoneknife、Tree、Material、Chair
两块石头-->一把石刀 ==> 从这里我们就应该想到两块石头应该作为参数传进去,
返回的结果是石刀,所以还需要一个用石头作原料制作石刀的类,
这里是KnifeFactory,它提供一个方法createKnife(Stone first, Stone second)
返回结果是StoneKnife。
石刀把树看成木材 ==> 这里我们应该想到StoneKnife需要提供一个方法cut(Tree)
返回值是Material
木材-->椅子 ==> 需要额外增加个椅子工厂类ChairFactory提供制作椅子的方法
makeChair(Material)返回结果是Chair
Stone
KnifeFactory
StoneKnife = KnifeFactory.createKnife(Stone first, Stone second)
Tree
Material = StoneKinfe.cut(Tree)
ChairFactory Chair = ChairFactory.makeChair(Material)
(2)“球从一根绳子的一段移动到了另一端”,
有两个对象绳子Rope和球Ball,一个必须有的方法move()
示意代码:
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) {
return null;
}
}
class Ball {
private Rope rope;
private Point currentPoint;
public Ball(Rope rope, Point startPoint) {
this.rope = rope;
currentPoint = startPoint;
}
public void move() {
currentPoint = rope.nextPoint(currentPoint);
System.out.println("小球移动到了" + currentPoint);
}
}
---------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! --------------