【Java基础学习】 接口与多态的形象化举例

来源:互联网 发布:谢菲尔德大学住宿 知乎 编辑:程序博客网 时间:2024/05/22 01:26

接口是对动作的抽象,表示的是这个对象能做什么。所以,当你关注一个操作的时候,用接口。


文字举例:在知乎看到一个非常形象的例子,觉得特别有意思,故改编了一下希望能帮助Java初学者对接口这个合同理解更深刻一些:

一个买粮食的接口,猫实现了该接口去买猫粮,狗实现来该接口去买狗粮,店小二类中有个可以根据客户类型卖粮食的方法,老板即主方法中实例化顾客和店小二,把卖粮食这件事交给店小二去做。


代码解释:

//假如我开了一个宠物粮店,声明所有宠物都可以来我这里买粮食,这就相当于一个接口,
interface BuyPetFood{
     public void buy();//接口里提供的方法是“买”而不是“卖”。“买”是动物发出的行为,不是宠物店发出的行为。
}
//当一只猫看到了,知道自己是宠物,所以它去实现这个接口
class Cat implements BuyPetFood{
   @Override
     public void buy(){
       System.out.println("我是猫,我要买猫粮");
     }
}
//当一只狗看到了,知道自己是宠物,所以它去实现这个接口
class Dog implements BuyPetFood{
    @Override
       public void buy(){
         System.out.println("我是狗,我要买狗食");
       }
}
//当狗和猫来我的店之前,我这个老板是不知道他们到底是什么,但是当他们来到我的店,我就知道一个要猫粮食,一个要狗粮食。因为他们都实现了 我这个接口,都可以买。下面这个类相当于一个接待顾客的类,即店小二,他接待所有实现了我这个宠物店接口的动物,传进来一个BuyPetFood类型的宠物,注意,这个BuyPetFood是接口
class PetShopHelper{
     public void Sell(BuyPetFood buyPetFood){
         buyPetFood.buy();
     }
}
//这个时候我这个老板出现了,我可以给他们卖粮食了,相当于测试类
public class Test{
     public static void main(String[] args){
         Cat cat = new Cat();////实例化一只猫,相当于把猫顾客实例化
         Dog dog = new Dog();////实例化一只狗,相当于把狗顾客实例化
         PetShopHelper petShopHelper = new PetShopHelper();//实例化一个店小二
         petShopHelper.Sell(cat);//把猫交给店小二
         petShopHelper.Sell(dog);//把狗交给店小二

        //此处将对象作为方法形参时,利用Java的多态,使接口的引用变量指向实现类实例时,使得代码简洁的好处。
     }

}

最终运行结果:

我是猫,我要买猫粮
我是狗,我要买狗娘


其他插花:

有人问:写店小二这个类,不是增加的代码量吗,是不是多此一举?

回答: 卖东西不会是简单的操作,会有“找东西”“递东西”“收钱”“记录”等各种各样的操作,这些细节不应该被猫和狗了解,也最好不要让老板去做这些琐事把。对于这种高度抽象的例子,不要太在意会不会少代码,很多时候是少不了的。重构类结构的目的也根本不是少代码,而是更精确的抽象和更少的复杂度。只不过,只要系统大到一定程度,达到以上目的一般会带来代码少的好处。


参考来源:

http://www.zhihu.com/question/20111251/answer/14760353


1 0
原创粉丝点击