• 设计模式六大原则(4):接口隔离原则(Interface Segregation Principle)


    接口隔离原则:

    • 使用多个专门的接口比使用单一的总接口要好。
    • 一个类对另外一个类的依赖性应当是建立在最小的接口上的。

    • 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口。这是对角色和接口的污染。

    • “不应该强迫客户依赖于它们不用的方法。

      接口属于客户。不属于它所在的类层次结构。”这个说得非常明确了。再通俗点说,不要强迫客户使用它们不用的方法,假设强迫用户使用它们不使用的方法。那么这些客户就会面临因为这些不使用的方法的改变所带来的改变。

    定义:client不应该依赖它不须要的接口;一个类对还有一个类的依赖应该建立在最小的接口上。

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

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

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

    设计模式六大原则(4):接口隔离原则 - 第1张  | 快课网

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

             这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。

    类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。对于类B和类D来说,尽管他们都存在着用不到的方法(也就是图中红色字体标记的方法)。但因为实现了接口I,所以也必需要实现这些用不到的方法。对类图不熟悉的能够參照程序代码来理解,代码例如以下:

     

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

    设计模式六大原则(4):接口隔离原则 - 第2张  | 快课网

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

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

     

            接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口。尽量细化接口。接口中的方法尽量少。也就是说。我们要为各个类建立专用的接口,而不要试图去建立一个非常庞大的接口供全部依赖它的类去调用。本文样例中,将一个庞大的接口变更为3个专用的接口所採用的就是接口隔离原则。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。

    接口是设计时对外部设定的“契约”,通过分散定义多个接口。能够预防外来变更的扩散,提高系统的灵活性和可维护性。

             讲到这里。非常多人会觉的接口隔离原则跟之前的单一职责原则非常相似。事实上不然。其一,单一职责原则原注重的是职责。而接口隔离原则注重对接口依赖的隔离。

    其二。单一职责原则主要是约束类,其次才是接口和方法。它针对的是程序中的实现和细节。而接口隔离原则主要约束接口接口,主要针对抽象,针对程序总体框架的构建。

             採用接口隔离原则对接口进行约束时。要注意下面几点:

    • 接口尽量小,可是要有限度。

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

    • 为依赖接口的类定制服务。仅仅暴露给调用的类它须要的方法,它不须要的方法则隐藏起来。

      仅仅有专注地为一个模块提供定制服务,才干建立最小的依赖关系。

    • 提高内聚。降低对外交互。使接口用最少的方法去完毕最多的事情。

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

  • 相关阅读:
    windows10的子系统linux(wsl)
    关于js的比较
    关于parseInt,很神奇
    vue修改数组元素通过arr[0]=val的方式不生效
    wps表格 VLookUp 函数
    青年大学习_收集截图方案
    个人记录_uwsgi,nginx与django之间的关系以及各自的作用
    Ubuntu16.04系统中创建新用户
    idea 启动或debug springboot web项目特别慢的解决方案
    利用Aop实现动态分库分表
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5069217.html
Copyright © 2020-2023  润新知