多态结合实际问题

上个学期老师就推荐了《Head.First设计模式》这本书,一直没有时间去看。从今天开始,终于有时间来仔细看了……今天看到的有两个设计原则,下面简单理解一下多态在实际问题中的应用。

按照这本书的例子和写作风格,我的笔记也这样记录下来。本书用一个制作鸭子的类进行引入:

公司制作的一个游戏中,定义了一个Duck类。

这天,公司为了升级游戏,决定在展示给客户的时候能让鸭子飞起来。按照OO设计思想,只要将fly()方法加入到Duck类中,其他的鸭子的子类,就都可以进行继承了,很不错的想法!于是,大家就这样做了。事后发现,这简直是个糊涂的决定,因为,如果我们派生出一个橡皮鸭,难道也要在天上飞来飞去吗?!肯定不行。

以上是基本的背景介绍。

一、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

也就是说,在设计之前,将可能变化的部分与不需要变化的部分分开来实现,以鸭子这个类为例的话,fly()方法就要分出来。

这个原则涉及到了每个编程过程。

二、针对接口编程,而不是针对实现编程

这一点,从本质上解决了本实例中出现的问题,其中主要涉及到的内容是多态。

首先,我们先看一下下面两个代码的区别:

1、面向实现编程:

Code:
  1. //面向实现编程   
  2. Dog d = new Dog();   
  3. d.bark();  

2、面向接口编程:

Code:
  1. //面向接口编程   
  2. Animal animal = new Dog();   
  3. animal.bark();  

同样,这里的例子也是一样:首先,我们肯定已经将鸭子飞的动作与Duck类分开来实现。那么,我们要想为了实现代码的重用,想到了可爱的多态,实现方法如下:

1、定义一个接口,写入鸭子飞的方法:

Code:
  1. public interface FlyBehavior{   
  2.   
  3. public void fly();   
  4. }  

2、两种飞的结果,一个是会飞,一个是不会飞,也就用两个类进行相应的实现:

Code:
  1. //会飞的鸭子可以继承这个类   
  2. public class FlyClass implements FlyBehavior{   
  3. public void fly(){   
  4. System.out.print("This class can fly!");   
  5. }   
  6. }  
Code:
  1. //不会飞的继承这个类   
  2. public class NoFlyClass implements FlyBehavior{   
  3.   
  4. public void fly(){   
  5. System.out.print("This class can not fly!");   
  6. }   
  7. }  

3、将之前的Duck类加到一起实现上述功能:

Duck.java实现过程:

Code:
  1. public class Duck{   
  2. FlyBehavior flybehavior ;   
  3. public void flyperform(){   
  4. flybehavior.fly();    
  5. }   
  6. //其他属性和方法   
  7. }  

定义可以飞的,FlyDuck.java实现过程:

Code:
  1. public class FlyDuck extends Duck{   
  2. public FlyDuck(){   
  3. flybehavior = new FlyClass();   
  4. }   
  5.   
  6. public static void main(String args[]){   
  7.   
  8. FlyDuck flyduck = new FlyDuck();   
  9. flyduck.flyperform();   
  10. }   
  11. }  

输出结果为:This class can fly!

也可以定义不可以飞的NoFlyDuck.java:

Code:
  1. public class NoFlyDuck extends Duck{   
  2. public NoFlyDuck(){   
  3. flybehavior = new NoFlyClass();   
  4. }   
  5.   
  6. public static void main(String args[]){   
  7.   
  8. NoFlyDuck noflyduck = new NoFlyDuck();   
  9. noflyduck.flyperform();   
  10. }   
  11. }  

输出结果:This class can not fly!

三、总结

利用接口实现了多态,而且,可以根据需要,将实现接口的类进行修改就可以全部改变子类鸭子的动作。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值