打字猴:1.700454627e+09
1700454627 首先我们想,玩具枪是不能用来射击的,杀不死人的,这个不应该写在shoot方法中。新增加的ToyGun的源代码如代码清单2-5所示。
1700454628
1700454629 代码清单2-5 玩具枪源代码
1700454630
1700454631 public class ToyGun extends AbstractGun{
1700454632
1700454633 //玩具枪是不能射击的,但是编译器又要求实现这个方法,怎么办?虚构一个呗!
1700454634
1700454635 @Override
1700454636
1700454637 public void shoot(){
1700454638
1700454639 //玩具枪不能射击,这个方法就不实现了
1700454640
1700454641 }
1700454642
1700454643 }
1700454644
1700454645 由于引入了新的子类,场景类中也使用了该类,Client稍作修改,源代码如代码清单2-6所示。
1700454646
1700454647 代码清单2-6 场景类
1700454648
1700454649 public class Client{
1700454650
1700454651 public static void main(String[]args){
1700454652
1700454653 //产生三毛这个士兵
1700454654
1700454655 Soldier sanMao=new Soldier();
1700454656
1700454657 sanMao.setGun(new ToyGun());
1700454658
1700454659 sanMao.killEnemy();
1700454660
1700454661 }
1700454662
1700454663 }
1700454664
1700454665 修改了粗体部分,把玩具枪传递给三毛用来杀敌,代码运行结果如下所示:
1700454666
1700454667 士兵开始杀敌人……
1700454668
1700454669 坏了,士兵拿着玩具枪来杀敌人,射不出子弹呀!如果在CS游戏中有这种事情发生,那你就等着被人爆头吧,然后看着自己凄惨地倒地。在这种情况下,我们发现业务调用类已经出现了问题,正常的业务逻辑已经不能运行,那怎么办?好办,有两种解决办法:
1700454670
1700454671 ❑在Soldier类中增加instanceof的判断,如果是玩具枪,就不用来杀敌人。这个方法可以解决问题,但是你要知道,在程序中,每增加一个类,所有与这个父类有关系的类都必须修改,你觉得可行吗?如果你的产品出现了这个问题,因为修正了这样一个Bug,就要求所有与这个父类有关系的类都增加一个判断,客户非跳起来跟你干架不可!你还想要客户忠诚你吗?显然,这个方案被否定了。
1700454672
1700454673 ❑ToyGun脱离继承,建立一个独立的父类,为了实现代码复用,可以与AbastractGun建立关联委托关系,如图2-3所示。
1700454674
1700454675
1700454676
[ 上一页 ]  [ :1.700454627e+09 ]  [ 下一页 ]