接口隔离原则的体现:一个类对另一个类的依赖应该建立在最小的接口上
实现需求如下图:
先看这张图所描述的:
B类 和 D类实现了该 接口Interface1 中的 五个方法
然后 A类 只需要使用该 接口Interface1 中的 1、2、3的方法
而 C类 只需要使用该 接口Interface1 中的 1、4、3的方法
来看下错误的代码: 会发现这样很多余,本身是不需要去使用的,但是还是将自己与它联系在了一起
Interface1接口的定义:
public interface Interface1 {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
public class demo1 {
public static void main(String[] args) {
B b = new B();
D d = new D();
A a = new A();
C c = new C();
a.depend1(b);
a.depend2(b);
a.depend3(b);
c.depend1(d);
c.depend2(d);
c.depend3(d);
}
}
class B implements Interface1{
@Override
public void operation1() {
System.out.println("我是operation1 !!!");
}
@Override
public void operation2() {
System.out.println("我是operation2 !!!");
}
@Override
public void operation3() {
System.out.println("我是operation3 !!!");
}
@Override
public void operation4() {
System.out.println("我是operation4 !!!");
}
@Override
public void operation5() {
System.out.println("我是operation5 !!!");
}
}
class D implements Interface1{
@Override
public void operation1() {
System.out.println("我是operation1 !!!");
}
@Override
public void operation2() {
System.out.println("我是operation2 !!!");
}
@Override
public void operation3() {
System.out.println("我是operation3 !!!");
}
@Override
public void operation4() {
System.out.println("我是operation4 !!!");
}
@Override
public void operation5() {
System.out.println("我是operation5 !!!");
}
}
class A{
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface1 i) {
i.operation2();
}
public void depend3(Interface1 i) {
i.operation3();
}
}
class C{
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface1 i) {
i.operation4();
}
public void depend3(Interface1 i) {
i.operation5();
}
}
上面的代码中我们需要让 A类 和 C类实现,但不是建立在 最小的接口上的,如果我们不是建立在最小的接口上,那么这两个类还要额外去联系这两个不需要用到的方法,这样会很多余!
解决方法:两个事项
1、将接口 Interface1 拆分为 独立的几个接口( 这里我们拆分成 3 个接口),类 A 和类 C 分别与他们需要的接口建立依赖关系,实现如下图所示,这也就是采用接口隔离原则!
2、类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D,如果接口 Interface1 对于类 A 和类 C来说不是最小接口,那么类 B 和类 D 必须去实现他们不需要的方法,那么在这里就要去实现另外两个用来实现隔离效果的接口
那么这里就需要拆解成三个接口来进行实现,其中两个接口来为A类和C类来进行接口隔离的实现
Interface1接口的定义:
public interface Interface1 {
void operation1();
}
Interface2接口的定义:
public interface Interface2 {
void operation2();
void operation3();
}
Interface3接口的定义:
public interface Interface3 {
void operation4();
void operation5();
}
代码如下:
public class demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
B b = new B();
D d = new D();
A a = new A();
C c = new C();
a.depend1(b);
a.depend2(b);
a.depend3(b);
c.depend1(d);
c.depend2(d);
c.depend3(d);
}
}
class B implements Interface1,Interface2{
@Override
public void operation1() {
System.out.println("我是operation1 !!!");
}
@Override
public void operation2() {
System.out.println("我是operation2 !!!");
}
@Override
public void operation3() {
System.out.println("我是operation3 !!!");
}
}
class D implements Interface1,Interface3{
@Override
public void operation1() {
System.out.println("我是operation1 !!!");
}
@Override
public void operation4() {
System.out.println("我是operation4 !!!");
}
@Override
public void operation5() {
System.out.println("我是operation5 !!!");
}
}
class A{
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface2 i) {
i.operation2();
}
public void depend3(Interface2 i) {
i.operation3();
}
}
class C{
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface3 i) {
i.operation4();
}
public void depend3(Interface3 i) {
i.operation5();
}
}