接口是对动作的抽象,表示的是这个对象能做什么。所以,当你关注一个操作的时候,用接口。
文字举例:在知乎看到一个非常形象的例子,觉得特别有意思,故改编了一下希望能帮助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