接口隔离原则
使用多个专门的接口比使用单一的总接口要好。
使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。
举例,现在有两个接口interfaceA和interfaceB,A中有方法A1、A2、A3、A4、A5。B中有方法B1、B2、B3,现在需要A中的方法A1、A2、A3和B中的方法B2。
A接口
分开的接口ABCD
举例,现在有两个接口interfaceA和interfaceB,A中有方法A1、A2、A3、A4、A5。B中有方法B1、B2、B3,现在需要A中的方法A1、A2、A3和B中的方法B2。
A接口
public interface A {
public void A1();
public void A2();
public void A3();
public void A4();
public void A5();
}
B接口
public interface B {
public void B1();
public void B2();
public void B3();
}
C实现AB接口中的某些方法
public class C implements A, B {
@Override
public void B1() {
// TODO Auto-generated method stub
}
@Override
public void B2() {
// TODO Auto-generated method stub
System.out.println("实现C中B2方法");
}
@Override
public void B3() {
// TODO Auto-generated method stub
}
@Override
public void A1() {
// TODO Auto-generated method stub
System.out.println("实现C中A1方法");
}
@Override
public void A2() {
// TODO Auto-generated method stub
System.out.println("实现C中A2方法");
}
@Override
public void A3() {
// TODO Auto-generated method stub
System.out.println("实现C中A3方法");
}
@Override
public void A4() {
// TODO Auto-generated method stub
}
@Override
public void A5() {
// TODO Auto-generated method stub
}
}
测试实例
public class testdemo {
public static void main(String arg[]){
C c=new C();
c.A1();
c.A2();
c.A3();
c.B2();
c.B1();
}
}
结果
实现C中A1方法
实现C中A2方法
实现C中A3方法
实现C中B2方法
虽然C中只是需要A和B中的某几个方法,但是在C实现AB接口使必须连同A和B中某些不需要使用的方法一同实现,虽然方法里面可以是空方法,但是使程序过于庞大,封装的过度。这时候我们就可以把这些接口方法分开来就可以
分开的接口ABCD
public interface A {
public void A1();
public void A2();
public void A3();
}
public interface B {
public void A4();
public void A5();
}
public interface C {
public void B1();
public void B3();
}
public interface D {
public void B2();
}
E类实现需要的方法
public class E implements A, D {
@Override
public void B2() {
// TODO Auto-generated method stub
System.out.println("实现E中B2方法");
}
@Override
public void A1() {
// TODO Auto-generated method stub
System.out.println("实现E中A1方法");
}
@Override
public void A2() {
// TODO Auto-generated method stub
System.out.println("实现E中A2方法");
}
@Override
public void A3() {
// TODO Auto-generated method stub
System.out.println("实现E中A3方法");
}
}
测试实例
public class testdemo {
public static void main(String arg[]){
E c=new E();
c.A1();
c.A2();
c.A3();
c.B2();
}
}
结果
实现E中A1方法
实现E中A2方法
实现E中A3方法
实现E中B2方法
接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。本文例子中,将一个庞大的接口变更为2个专用的接口所采用的就是接口隔离原则。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
说到这里,很多人会觉的接口隔离原则跟之前的单一职责原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
采用接口隔离原则对接口进行约束时,要注意以下几点:
1、接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2、为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3、提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。