黑马程序员_23再谈面向对象


----------------- 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培训、期待与您交流! --------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值