`
youyu4
  • 浏览: 435953 次
社区版块
存档分类
最新评论

设计原则--接口隔离原则

 
阅读更多

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

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

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

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

        这个图的意思是:类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");  
    }  
    //对于类B来说,method4和method5不是必需的,但是由于接口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");  
    }  
    //对于类D来说,method2和method3不是必需的,但是由于接口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所示:

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

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个专用的接口所采用的就是接口隔离原则。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

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

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

  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
  • 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

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

 

 

分享到:
评论

相关推荐

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

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

    面向对象设计原则(SRP,OCP,LSP,DIP,ISP)

    面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP

    c++接口隔离原则1

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

    接口隔离原则ISP.zip

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

    JAVA设计模式之设计原则 ---开闭原则源码

    4. **接口隔离原则(ISP,Interface Segregation Principle)**:避免接口过大,保持接口的专一性,让客户端只依赖于他们需要的方法。 5. **依赖注入**:通过构造函数、setter方法或者工厂方法等方式,将依赖关系从...

    面向对象的设计原则--ooprinciples

    - **接口隔离**:创建多个专门的接口,而不是一个庞大的接口,让类只依赖于它们需要的接口。 - **抽象化**:通过抽象类或接口定义共同的行为,使得具体实现可以根据需要扩展而不会影响到现有代码。 #### 四、总结 ...

    设计模式6大原则:接口隔离原则

    设计模式6大原则:接口隔离原则

    24种设计模式介绍与6大设计原则-PDF版 查阅方便

    4. 接口隔离原则:避免使用宽泛的接口,尽量细化接口,每个接口只做一件事。 5. 依赖倒置原则:依赖于抽象而不是具体实现,使得系统更灵活,降低耦合度。 6. 迪米特法则(最少知识原则):一个对象应该对其他对象有...

    23种 设计模式---面向对象的基本原则

    4. 接口隔离原则(Interface Segregation Principle, ISP):不应该强迫客户端依赖于它们不需要的方法。将大的接口拆分为小的、更具体的接口,使得客户端只需关注所需的部分。 5. 依赖倒置原则(Dependency ...

    软件开发的201个原则 -- 中文版.zip

    - **接口隔离原则**:客户端不应该依赖它不需要的接口,接口应该小而具体。 - **依赖倒置原则**:依赖于抽象,而不是具体的实现,使得系统更加灵活,易于测试和维护。 6. **TDD(测试驱动开发)**:先写测试,再...

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

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

    《架构真经-互联网技术架构的设计原则-第2版》.pdf

    互联网技术架构的设计原则是架构师和开发人员在构建现代互联网应用时必须遵循的关键准则。这些原则有助于确保系统能够适应不断变化的需求,同时保持高性能、高可用性、可扩展性和灵活性。 1. **模块化设计**:模块...

    RS-485工业接口的设计应用指南

    RS-485工业接口是一种广泛应用于工业领域的串行通信接口标准,具有良好的抗干扰性...在进行RS-485接口设计时,设计师需要综合考虑电气特性、布线原则、信号完整性和电磁兼容性等方面,以确保设计出稳定可靠的通信系统。

    C++设计原则 完整整理 快速理解设计原则

    5. **接口隔离原则(Interface Segregation Principle, ISP)**: - ISP主张接口应当保持小巧且专注,避免创建大而全的接口,因为客户端可能只需要其中的一部分方法。将接口拆分为更小的接口,可以让客户端只依赖...

    JAVA设计模式-原则和23种设计模式归纳总结

    本资源首先介绍了设计模式的六大原则,包括单一责任原则、开闭原则、里氏替换原则、接口隔离原则、合成复用原则和最少知道原则。然后,资源对23种设计模式进行了分类和总结,包括创建型模式、结构型模式和行为型模式...

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

    面向对象编程中,接口隔离原则(ISP)是五大设计原则之一,它建议不应该强迫客户端依赖于它们不用的接口。在PHP中实现ISP,可以避免不必要的依赖,提高代码的可维护性和灵活性。下面详细说明接口隔离原则的概念、...

    15丨软件设计的接口隔离原则:如何对类的调用者隐藏类的公有方法?.pdf

    接口隔离原则是面向对象设计中的一个重要原则,它强调的是设计接口时应尽可能保持接口的专注性,避免让接口承担过多职责,从而减少不必要的耦合。这一原则的核心思想是:一个类不应该被迫依赖于它不需要的方法,即...

    软件开发设计原则

    这些原则包括单一职责原则、开放封闭原则、里氏替换原则、最少知识原则、接口隔离原则和依赖倒置原则等。 1. 单一职责原则(Single Responsibility Principle - SRP) 单一职责原则是指一个类应该只有一个原因去...

    设计模式复习题.doc

    - 接口隔离原则 5. 设计模式的实现方式: - 使用继承来实现工厂模式 - 使用组合来实现抽象工厂模式 - 使用代理模式来控制对象的访问 - 使用适配器模式来封装对象并提供不同的接口 6. 设计模式的优点: - ...

    软件设计的七大原则.doc

    软件设计的七大原则是软件设计的精髓所在,这七大原则分别是开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。 一、 开闭原则(OCP) 开闭原则是指一个软件实体...

Global site tag (gtag.js) - Google Analytics