接口隔离原则 (ISP: Interface Segregation Principle) 有两种定义:客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上。
类之间通过接口依赖的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class Interfacesegregation { public static void main (String[] args) { B b = new B (); b.dependA(new A ()); } interface InterfaceCommon { void methodA () ; void methodOther () ; } private static class A implements InterfaceCommon { public void methodA () { System.out.println("A类方法" ); } public void methodOther () { System.out.println("其他类方法" ); } } private static class B { public void dependA (InterfaceCommon interfaceCommon) { System.out.println("通过公共接口依赖A类调用A类方法" ); } } }
在上面的例子中可以看出,我们使用 B 类时想通过公共接口 InterfaceCommon 依赖 A 类,调用 A 类实现的方法,但是 A 类在实现自己的方法时还必须去实现其他类的方法。因此,InterfaceCommon 对于 B 来说不是最小的接口,违背了接口隔离原则。更改方案,将 InterfaceCommon 拆分为独立的接口,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class Interfacesegregation1 { public static void main (String[] args) { B b = new B (); b.dependC(new A ()); } private interface InterfaceA { void methodA () ; } private interface InterfaceOther { void methodOther () ; } private static class A implements InterfaceA { public void methodA () { System.out.println("A类方法" ); } } private static class B { public void dependC (InterfaceA interfaceA) { System.out.println("通过最小接口依赖A类调用A类方法" ); } } }
采用接口隔离原则对接口进行约束时,要注意以下几点:
接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。 接口隔离原则和单一职责的异同:
侧重点不一样,单一职责原则注重的是类的功能职责单一;接口隔离原则注重的是对接口依赖的隔离; 约束对象不一样,单一职责原则主要约束类,它针对的是类的功能职责,程序的实现和细节;接口隔离原则主要约束接口,它针对的是接口模板功能的设计构建。 附:本次演示的项目地址 https://github.com/syshlang/java-design-principle