基本介绍
客户端不应该依赖它不需要的接口,即一个类对另外一个类的依赖应该建立在最小的接口上。
改造前:
改造前,如下UML图所示
代码实现:
public interface Interface1 {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
public class B implements Interface1 {
@Override
public void operation1() {
System.out.println("B 实现了operation1");
}
@Override
public void operation2() {
System.out.println("B 实现了operation2");
}
@Override
public void operation3() {
System.out.println("B 实现了operation3");
}
@Override
public void operation4() {
System.out.println("B 实现了operation4");
}
@Override
public void operation5() {
System.out.println("B 实现了operation5");
}
}
public class D implements Interface1 {
@Override
public void operation1() {
System.out.println("D 实现了operation1");
}
@Override
public void operation2() {
System.out.println("D 实现了operation2");
}
@Override
public void operation3() {
System.out.println("D 实现了operation3");
}
@Override
public void operation4() {
System.out.println("D 实现了operation4");
}
@Override
public void operation5() {
System.out.println("D 实现了operation5");
}
}
public class A {
public void depend1(Interface1 inteface1){
inteface1.operation1();
}
public void depend2(Interface1 inteface1){
inteface1.operation2();
}
public void depend3(Interface1 inteface1){
inteface1.operation3();
}
}
public class C {
public void depend1(Interface1 inteface1){
inteface1.operation1();
}
public void depend4(Interface1 inteface1){
inteface1.operation4();
}
public void depend5(Interface1 inteface1){
inteface1.operation5();
}
}
类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D。如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。
按照接口隔离原则应当如下处理:
将接口Interface1拆分成几个接口(这里我们拆分成3个接口),类A和类C分别与他们需要的接口建立依赖关系。
改造后:
改进的UML类图如下:
改进后的代码如下:
public interface Interface1 {
void operation1();
}
public interface Interface2 {
void operation2();
void operation3();
}
public interface Interface3 {
void operation4();
void operation5();
}
public class B implements Interface1,Interface2 {
@Override
public void operation1() {
System.out.println("B 实现了operation1");
}
@Override
public void operation2() {
System.out.println("B 实现了operation2");
}
@Override
public void operation3() {
System.out.println("B 实现了operation3");
}
}
public class D implements Interface1,Interface3 {
@Override
public void operation1() {
System.out.println("D 实现了operation1");
}
@Override
public void operation4() {
System.out.println("D 实现了operation4");
}
@Override
public void operation5() {
System.out.println("D 实现了operation5");
}
}
public class A {
public void depend1(Interface1 inteface){
inteface.operation1();
}
public void depend2(Interface2 inteface){
inteface.operation2();
}
public void depend3(Interface2 inteface){
inteface.operation3();
}
}
public class C {
public void depend1(Interface1 inteface){
inteface.operation1();
}
public void depend4(Interface3 inteface){
inteface.operation4();
}
public void depend5(Interface3 inteface){
inteface.operation5();
}
}
测试代码如下:
public static void main(String[] args) {
A a = new A();
a.depend1(new B()); //A 类通过接口去依赖(使用)B
a.depend2(new B());
a.depend3(new B());
C c = new C();
c.depend1(new D());//C 类通过接口去依赖(使用)D
c.depend4(new D());
c.depend5(new D());
}