1.概述
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
2.案例
2.1.描述
类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D。
2.2.代码
nterface Interface1 {
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
class B implements Interface1 {
public void operation1() {
System.out.println("B -operation1");
}
public void operation2() {
System.out.println("B -operation2");
}
public void operation3() {
System.out.println("B -operation3");
}
public void operation4() {
System.out.println("B -operation4");
}
public void operation5() {
System.out.println("B -operation5");
}
}
class D implements Interface1 {
public void operation1() {
System.out.println("D -operation1");
}
public void operation2() {
System.out.println("D -operation2");
}
public void operation3() {
System.out.println("D -operation3");
}
public void operation4() {
System.out.println("D -operation4");
}
public void operation5() {
System.out.println("D -operation5");
}
}
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();
}
}
2.3.分析
可以看出,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。
2.4改善
按隔离原则应当这样处理:
将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。
interface Interface1 {
void operation1();
}
interface Interface2 {
void operation2();
void operation3();
}
interface Interface3 {
void operation4();
void operation5();
}
class B implements Interface1, Interface2 {
public void operation1() {
System.out.println("B -operation1");
}
public void operation2() {
System.out.println("B -operation2");
}
public void operation3() {
System.out.println("B -operation3");
}
}
class D implements Interface1, Interface3 {
public void operation1() {
System.out.println("D -operation1");
}
public void operation4() {
System.out.println("D -operation4");
}
public void operation5() {
System.out.println("D -operation5");
}
}
class A { // A通过Interface1,Interface2 依赖B 1,2,3
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface2 i) {
i.operation2();
}
public void depend3(Interface2 i) {
i.operation3();
}
}
class C { // C通过Interface1,Interface3 依赖D 1,4,5
public void depend1(Interface1 i) {
i.operation1();
}
public void depend4(Interface3 i) {
i.operation4();
}
public void depend5(Interface3 i) {
i.operation5();
}
}
测试
public class Segregation1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A();
a.depend1(new B());
a.depend2(new B());
a.depend3(new B());
C c = new C();
c.depend1(new D());
c.depend4(new D());
c.depend5(new D());
}
}
3.注意事项和细节
在具体应用接口隔离原则时,应该根据一下几个规则衡量:
- 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
- 为依赖接口类定制服务。值提供调用者需要的方法,屏蔽不需要的方法。
- 根据具体环境。环境不同,接口拆分的标准就不同。
- 提高内聚,减少对外交互。让接口用最少的方法完成最多的事情。