`

接口隔离原则ISP(Interface Segregation Principle)

阅读更多
一、ISP简介(ISP--Interface Segregation Principle):
使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

 

“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

问题由来:A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

举例来说明接口隔离原则:

 

(图1  未遵循接口隔离原则的设计)

         这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。对类图不熟悉的可以参照程序代码来理解,代码如下:

 

interface I {

    public void method1();

    public void method2();

    public void method3();

    public void method4();

    public void method5();

}

 

class A{

    public void depend1(I i){

       i.method1();

    }

    public void depend2(I i){

       i.method2();

    }

    public void depend3(I i){

       i.method3();

    }

}

 

class B implements I{

    public void method1() {

       System.out.println("B实现接口I的方法1");

    }

    public void method2() {

       System.out.println("B实现接口I的方法2");

    }

    public void method3() {

       System.out.println("B实现接口I的方法3");

    }

    //对于类A来说,method4method5不是必需的,但是由于接口A中有这两个方法,

    //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。

    public void method4() {}

    public void method5() {}

}

 

class C{

    public void depend1(I i){

       i.method1();

    }

    public void depend2(I i){

       i.method4();

    }

    public void depend3(I i){

       i.method5();

    }

}

 

class D implements I{

    public void method1() {

       System.out.println("D实现接口I的方法1");

    }

    //对于类C来说,method2method3不是必需的,但是由于接口A中有这两个方法,

    //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。

    public void method2() {}

    public void method3() {}

 

    public void method4() {

       System.out.println("D实现接口I的方法4");

    }

    public void method5() {

       System.out.println("D实现接口I的方法5");

    }

}

 

public class Client{

    public static void main(String[] args){

       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.depend2(new D());

       c.depend3(new D());  }

}

 

可以看到,如果接口过于臃肿,只要接口中出现的方法,不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法,这显然不是好的设计。如果将这个设计修改为符合接口隔离原则,就必须对接口I进行拆分。在这里我们将原有的接口I拆分为三个接口,拆分后的设计如图2所示:

 

(图2  遵循接口隔离原则的设计)

照例贴出程序的代码,供不熟悉类图的朋友参考:

interface I1 {

    public void method1();

}

 

interface I2 {

    public void method2();

    public void method3();

}

 

interface I3 {

    public void method4();

    public void method5();

}

 

class A{

    public void depend1(I1 i){

       i.method1();

    }

    public void depend2(I2 i){

       i.method2();

    }

    public void depend3(I2 i){

       i.method3();

    }

}

 

class B implements I1, I2{

    public void method1() {

       System.out.println("B实现接口I1的方法1");

    }

    public void method2() {

       System.out.println("B实现接口I2的方法2");

    }

    public void method3() {

       System.out.println("B实现接口I2的方法3");

    }

}

 

class C{

    public void depend1(I1 i){

       i.method1();

    }

    public void depend2(I3 i){

       i.method4();

    }

    public void depend3(I3 i){

       i.method5();

    }

}

 

class D implements I1, I3{

    public void method1() {

       System.out.println("D实现接口I1的方法1");

    }

    public void method4() {

       System.out.println("D实现接口I3的方法4");

    }

    public void method5() {

       System.out.println("D实现接口I3的方法5");

    }

}

 

接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。本文例子中,将一个庞大的接口变更为3个专用的接口所采用的就是接口隔离原则。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

         说到这里,很多人会觉的接口隔离原则跟之前的单一职责原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。

         采用接口隔离原则对接口进行约束时,要注意以下几点:

l   接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

l   为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

l   提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。

分享到:
评论

相关推荐

    Interface Segregation Principle

    接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计中SOLID原则的第五个原则,旨在解决接口设计中的一些问题,以提升代码的模块化和减少不必要的依赖。Robert C. Martin(通常被称为“鲍勃叔叔”...

    接口隔离原则ISP.zip

    接口隔离原则(Interface Segregation Principle,简称ISP)是软件设计中的一个重要原则,它在面向对象的设计模式中占有核心地位。这个原则由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Architecture》中...

    IOS设计模式的六大设计原则之接口隔离原则(ISP,Interface Segregation Principle)-附件资源

    IOS设计模式的六大设计原则之接口隔离原则(ISP,Interface Segregation Principle)-附件资源

    接口隔离原则 接口隔离原则

    接口隔离原则(Interface Segregation Principle,ISP)是设计模式中的一个重要原则,它是 SOLID 原则之一。SOLID 是面向对象设计的五个基本原则的首字母缩写,由 Robert C. Martin 提出,旨在使软件设计更加灵活、...

    c++接口隔离原则1

    接口隔离原则(Interface Segregation Principle,ISP)是C++中的一个重要设计原则,它旨在降低类之间的耦合性,提高系统的灵活性和可维护性。本文将详细介绍接口隔离原则的定义、优点、实现方法和应用实例。 定义 ...

    软件设计七大原则详解 1. 单一职责原则(Single Responsibility Principle, SRP) 1.1 原则定义 1.2 为什么需要单一职责原则? 1.3 违反单一职责原则的例子

    4. 接口隔离原则(Interface Segregation Principle, ISP) 4.1 原则定义 4.2 为什么需要接口隔离原则? 4.3 违反接口隔离原则的例子 4.4 应用接口隔离原则的改进 4.5 现实应用场景 4.6 接口隔离原则的注意事项 5. ...

    深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解

    本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle)。 英文原文:...

    Java_面向对象设计原则总结

    3 接口分隔原则-Interface Segregation Principle (ISP) 4 单一职责原则-Single Responsibility Principle (SRP) 5 开闭原则-The Open-Closed Principle (OCP)   二 包的设计原则 6 重用发布等价原则-...

    JAVA六大原则代码.zip

    这个压缩文件包含了与JAVA编程相关的六大原则的实例代码。这些原则被称为SOLID原则,是Robert C. Martin等软件工程师提出的一组设计原则。...接口隔离原则(Interface Segregation Principle,ISP):不应该强迫一个

    简单理解遵循接口隔离原则的Java设计模式编程

    接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计的SOLID原则之一,它强调了接口设计的灵活性和针对性。ISP指出,一个类不应该被迫依赖它不需要的接口,即类之间的依赖关系应当建立在最小化的...

    PHP面向对象五大原则之接口隔离原则(ISP)详解

    接口隔离原则(Interface Segregation Principle, ISP)是PHP面向对象编程中的一个重要概念,它是面向对象设计的五大原则(SOLID)之一。ISP主张一个类不应该被迫实现它不需要的方法,也就是说,客户端应该只依赖于...

    java面向对象设计的六大原则

    DIP)、接口隔离原则(Interface Segregation Principle, ISP)以及合成/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)。 #### 1. 单一职责原则(Single Responsibility Principle, SRP) - **定义...

    软件架构设计的6大原则.pdf

    5. 接口隔离原则(Interface Segregation Principle - ISP) 接口隔离原则是指一个类与另一个类之间的依赖性,应该依赖于尽可能小的接口。这个原则强调了接口的实用性和精简性,防止接口的臃肿和不必要的暴露。应用...

    cis-3285-unit-13-interface-segregation-PJRubin:cis-3285-unit-13-interface-segregation-PJRubin由GitHub Classroom创建

    【标题】 cis-3285-unit-13-interface-segregation-PJRubin:这是一个关于接口隔离原则(Interface Segregation Principle, ISP)的学习项目,由GitHub Classroom创建。ISP是面向对象设计中的一个重要原则,旨在避免...

    面向对象七大基本设计原则.pdf

    5. 接口隔离原则(Interface Segregation Principle, ISP):不应该强迫客户依赖于它们不使用的接口。换句话说,接口应该细而专,不应该庞大而复杂。 文档中提到的Java setter可能是指在类中设置属性值的setter方法...

    软件开发设计原则

    5. 接口隔离原则(Interface Segregation Principle - ISP) 接口隔离原则是指不要对外暴露没有实际意义的接口。换句话说,接口是给别人调用的,那就不要去为难别人了,尽可能保证接口的实用性吧。 在实际应用中,...

    六大设计原则.docx

    LoD)、接口隔离原则(Interface Segregation Principle,ISP)以及依赖倒置原则(Dependence Inversion Principle,DIP)。这些原则旨在提升代码的可维护性、灵活性和扩展性。 **单一职责原则(SRP)**: SRP规定...

    java oo 设计原则

    6. 接口隔离原则_Interface Segregation Principle, ISP) ISP建议避免一个接口太大,将一组相关的操作组合成一个接口,让客户端仅依赖于他们需要的方法。这样做可以减少不必要的接口依赖,提高代码的灵活性和可维护...

    六大设计原则,一些小例子(通俗易懂)

    4. 接口隔离原则(Interface Segregation Principle, ISP) 接口隔离原则建议我们避免让客户端依赖它们不使用的接口方法。如果一个接口太大,包含了许多不相关的功能,我们应该将其拆分为多个更小、更具体的接口。...

Global site tag (gtag.js) - Google Analytics