1.什么是耦合?
通俗来讲,耦合就是绑定,要完成某件事,互相离不开对方。
2.接口解耦的过程讲解
接口解耦,实际上是面向对象的多态特性的应用。我们来举例说明解耦的过程。
以一个简单的喂食动物为例:现有一个动物饲养员,负责给动物喂食,动物看到食物完成进食。
假设我们要喂一只猫和一条狗,猫吃鱼,狗吃肉,下面分别用接口和非接口的方式实现上述过程:
2.1 非接口实现方式
根据面向对象的特性,整个过程涉及三个实体:饲养员、小动物
先将这三个实体抽象成Java对象
@Data
public class Cat{
int size;
public void eat(){
System.out.println("cat is eating fish);
}
}
@Data
public class Dog{
int size;
public void eat(){
System.out.println("dog is eating meat);
}
}
@Data
public class AnimalKeeper{
int age;
String name;
public void feedCat(Cat cat){
cat.eat();
}
public void feedDog(Dog dog){
dog.eat();
}
}
main方法中实现动物喂养过程:可见,喂养两个不同的动物,需要定义两个不同的方法,将对应的动物对象Cat和Dog传入,才能实现方法调用。
public class Main{
public static void main(String[] args){
AnimalKeeper keeper=new AnimalKeeper();
Cat cat=new Cat();
Dog dog=new Dog();
keeper.feedCat(cat);
keeper.feedDog(dog);
}
}
2.2 接口实现方式
上述实现,方法feedCat和feedDog和对象Cat、Dog之间是耦合关系,我们引入一个Animal接口来解耦:
public interface Animal{
eat();
}
猫狗分别实现该接口中的eat方法
@Data
public class Cat implements Animal{
int size;
@Override
public void eat(){
System.out.println("cat is eating fish);
}
}
@Data
public class Dog implements Animal{
int size;
@Override
public void eat(){
System.out.println("dog is eating meat);
}
}
注意看,饲养员类发生了变化:之前的feedCat和feedDog统一成了feed方法,参数变成了抽象的Animal类,代码简化了。相当于饲养员自己做了一个专门喂食动物的小盒子,只要把动物从门里放进去,就能完成喂食。
降低耦合的好处:不用接口,如果有100个动物,饲养员类中需要定义100个相应的喂食方法,如果是1000个,10000个呢?使用接口的话,不管有多少个动物,饲养员类中一个方法就能搞定了。
public class AnimalKeeper {
int age;
String name;
public void feed(Animal animal)
{
animal.eat();
}
}
main方法不变:
public class Main{
public static void main(String[] args){
AnimalKeeper keeper=new AnimalKeeper();
Cat cat=new Cat();
Dog dog=new Dog();
keeper.feed(cat);
keeper.feed(dog);
}
}
涉及到的多态:用Animal对象接收Cat和Dog对象,完成多态。
普通的多态形式:
Animal animal=new Cat()、Animal animal=new Dog();