先看一段代码
public class A {
public void say() {
System.out.println("I am A");
}
}
public class C {
public void put(A a) {
a.say();
}
}
在C类里面想调用一个含有say功能的东西,就把A传入了,突然有一天,产品经理多了个需求,想让B这种类型也能在C中作为参数调用B的say,也即A,B这两种类型都能满足作为输入,
public class B {
public void say() {
System.out.println("I am B");
}
}
那好烦,不仅要像上面一样新建B类,还要修改C的代码适配需求,例如改成下面这个样子,搞成重载的样子,万一产品经理又来要求把D,E,F...这些具有say功能的类可以当成参数输入,新建D,E,F这些类也就算了,难免嘛,问题是还要修改C的类,在里面再添加很多类似的修改,感觉耦合的很紧,代码写的太死板了,变动下需求就得改主程序C里面的代码,
public class C{
public void put(A a) {
a.say();
}
public void put(B b) {
b.say();
}
}
有没有其他的好办法?有,用接口的方法,例如下面
public interface IBase {
void say();
}
public class A implements IBase {
@Override
public void say() {
System.out.println("I am A");
}
}
public class B implements IBase {
@Override
public void say() {
System.out.println("I am B");
}
}
public class C {
public void put(IBase base) {
base.say();
}
}
定义一个接口,IBase,让产品经理新加的需求B,D,E,F都实现这个类,并且把C类里的参数写成接口的形式(只要实现了我这个接口功能的都能传入),这样只要是实现了IBase接口的类,也即实现具备了实现接口say功能的任何类都可以传进来,所以以后只需要新建B,D,E,F时实现这个接口就行了,不需要在C类里面修改源代码。
这就大大降低了工作量,本质上就是降低了耦合度,体现了接口的解耦效果,这是一点关于对接口解耦作用的理解
参考博客: