接口隔离原则(Interface Segregation Principle)
基本介绍
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上
类A通过接口Interface1依赖类B,类C通过接口Interface1依赖(使用)类B,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法
dart
package com.baidu.principle.segregation;
public class SegregationDemo1 {
public static void main(String[] args) {
A a = new A();
Interface1 i1 = new B();
a.depend1(i1);
a.depend2(i1);
a.depend3(i1);
C c = new C();
Interface1 i2 = new D();
c.depend1(i2);
c.depend4(i2);
c.depend5(i2);
}
}
interface Interface1 {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
class B implements Interface1 {
@Override
public void operation1() {
System.out.println("B实现了操作1");
}
@Override
public void operation2() {
System.out.println("B实现了操作2");
}
@Override
public void operation3() {
System.out.println("B实现了操作3");
}
@Override
public void operation4() {
System.out.println("B实现了操作4");
}
@Override
public void operation5() {
System.out.println("B实现了操作5");
}
}
class D implements Interface1 {
@Override
public void operation1() {
System.out.println("D实现了操作1");
}
@Override
public void operation2() {
System.out.println("D实现了操作2");
}
@Override
public void operation3() {
System.out.println("D实现了操作3");
}
@Override
public void operation4() {
System.out.println("D实现了操作4");
}
@Override
public void operation5() {
System.out.println("D实现了操作5");
}
}
class A {
// A 类通过接口Interface1 依赖使用B,但是只会用到1,2,3方法
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface1 i) {
i.operation2();
}
public void depend3(Interface1 i) {
i.operation3();
}
}
class C {
// C 类通过接口Interface1 依赖使用D,但是只会用到1,4,5方法
public void depend1(Interface1 i) {
i.operation1();
}
public void depend4(Interface1 i) {
i.operation4();
}
public void depend5(Interface1 i) {
i.operation5();
}
}
解决:
将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系,也就是采用接口隔离原则
dart
package com.baidu.principle.segregation.improve;
public class SegregationDemo1 {
public static void main(String[] args) {
}
}
interface Interface1 {
void operation1();
}
interface Interface2 {
void operation2();
void operation3();
}
interface Interface3 {
void operation4();
void operation5();
}
class B implements Interface1, Interface2 {
@Override
public void operation1() {
}
@Override
public void operation2() {
}
@Override
public void operation3() {
}
}
class D implements Interface1, Interface3 {
@Override
public void operation1() {
}
@Override
public void operation4() {
}
@Override
public void operation5() {
}
}
class A {
// A 类通过接口Interface1 依赖使用B,但是只会用到1,2,3方法
public void depend1(Interface1 interface1) {
interface1.operation1();
}
public void depend2(Interface2 interface2) {
interface2.operation2();
}
public void depend3(Interface2 interface2) {
interface2.operation3();
}
}
class C {
// C 类通过接口Interface1 依赖使用D,但是只会用到1,4,5方法
public void depend1(Interface1 interface1) {
interface1.operation1();
}
public void depend4(Interface3 interface3) {
interface3.operation4();
}
public void depend5(Interface3 interface3) {
interface3.operation5();
}
}