接口为什么能降低耦合?
所谓耦合,用白话概括就是,完成某件事情所用到的两个target之间的相互关联程度。看完下面这个实例,你应该对这个问题有一定的了解。
背景:动物饲养员喂养动物,猫吃鱼,狗吃肉。
1.非接口方法:猫狗只能分开喂。
耦合体现在:写出的两种方法,必须传入指定的对象,使得对象和方法被绑定,即耦合。若Cat或Dog类被销毁,对应的方法就无法使用。
public class AnimalKeeper {
public static void main(String[] args) {
//1.喂猫
Feed(new Cat());
//2.喂狗
Feed(new Dog());
}
public static void FeedCat(Cat cat)
{
cat.eat();
}
public static void FeedDog(Dog dog)
{
dog.eat();
}
}
2.使用接口:“多加一层”,消除耦合
2.1 定义Animal接口,声明了eat方法,但不涉及具体实现
public class AnimalKeeper {
public static void main(String[] args) {
//1.喂猫
Feed(new Cat());
//2.喂狗
Feed(new Dog());
}
public static void Feed(Animal animal)
{
animal.eat();
}
}
2.2 接口方法具体实现1:猫吃鱼
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("cats eat fish");
}
}
2.3接口中方法的具体实现2:狗吃肉
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("dogs eat meat");
}
}
2.4 饲养员喂养猫和狗:从方法名上看,这种饲养方法从具体的猫狗上升到Animal,更具普遍性,从参数上看,不再关心来的(传来的参数)是猫还是狗,饲养方法和具体动物不再绑定。实现了降低耦合。好处不止降低了耦合,还有利于扩展程序。比如:饲养员需要负责一种新动物的饮食,比如大象,那么让大象类继承Animal接口,重写eat方法即可。
容易发现,main方法还是new了两个对象,main方法的实现离不开这两个对象。若要进一步降低这种耦合,还需要剔除main方法中的new关键字。不用慌,仍是采用“加一层”的思想,具体涉及到spring框架知识,后续有时间我再给出详解。
public class AnimalKeeper {
public static void main(String[] args) {
//1.喂猫
Feed(new Cat());
//2.喂狗
Feed(new Dog());
}
public static void Feed(Animal animal)
{
animal.eat();
}
}
