系列文章目录

软件设计原则之单一职责原则、开闭原则
软件设计原则之里氏替换原则、依赖倒置原则
软件设计原则之接口隔离原则、合成复用原则、迪米特原则


文章目录

  • 系列文章目录
  • 一、接口隔离原则
    • 什么是接口隔离原则(What)
    • 为什么使用接口隔离原则(Why)
    • 如何使用接口隔离原则(How)
  • 二、合成复用原则
    • 什么是合成复用原则(What)
    • 为什么使用合成复用原则(Why)
    • 如何使用合成复用原则(How)
  • 三、迪米特原则
    • 什么是迪米特原则(What)
    • 为什么使用迪米特原则(Why)
    • 如何使用迪米特原则(How)

一、接口隔离原则

什么是接口隔离原则(What)

接口隔离原则,ISP,Interface Segregation Principle
定义:用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。
这里的“接口”有两种不同的含义:

  • 一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象。
    此时,接口的划分将直接带来类型的划分。可以把接口理解成角色,一个接口只能代表一个角色,每个角色都有它特定的一个接口,此时,这个原则可以叫作“角色隔离原则”。
  • 某种语言具体的“接口”定义
    此时,该原则表达的意思是指接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。在面向对象编程语言中,实现一个接口就需要实现该接口中定义的所有方法,因此大的总接口使用起来不一定很方便。为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并各承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口。

为什么使用接口隔离原则(Why)

我们可以反过来问,如果不遵循接口隔离原则,会怎样。如果接口承担了太多职责,会导致以下后果:

  • 导致该接口的实现类很庞大,在不同的实现类中都不得不实现接口中定义的所有方法,灵活性较差,如果出现大量的空方法,将导致系统中产生大量的无用代码,影响代码质量;
  • 由于客户端针对大接口编程,将在一定程度上破坏程序的封装性,客户端看到了不应该看到的方法,没有为客户端定制接口。

因此需要将该接口按照接口隔离原则和单一职责原则进行重构,将其中的一些方法封装在不同的小接口中,确保每个接口使用起来都较为方便,并各承担某一单一角色,每个接口中只包含一个客户端(如模块或类)所需的方法即可。
接口隔离原则符合我们常说的高内聚低耦合的设计思想,使的类具有很好的可读性、可扩展性和可维护性。

如何使用接口隔离原则(How)

  • 建立单一接口,不要建立庞大臃肿的接口。当一个接口太大时,需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
  • 注意控制接口的粒度。接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。

「接口隔离原则」与「单一职责原则」
个人的理解,可以把「单一职责原则」比作指导思想,而「接口隔离原则」就是这个思想的一种具体实践。

二、合成复用原则

什么是合成复用原则(What)

合成复用原则,CRP,Composite Reuse Principle
又叫组合/聚合复用原则,CARP,Composition/Aggregate Reuse Principle
定义:尽量使用对象组合,而不是继承来达到复用的目的。
「合成复用原则」就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承。
「合成复用原则」同「里氏替换原则」相辅相成的,两者都是「开闭原则」的具体实现规范。

为什么使用合成复用原则(Why)

通常类的复用分为“继承复用”和“合成复用”两种。“继承复用”虽然有简单和易实现的优点,但它也存在以下缺点:

  • 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
  • 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  • 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。
  • 继承方式过度使用,会导致类的数量快速增长,会增加系统构建和维护的难度以及系统的复杂度。

采用“合成复用”时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点:

  • 它维持了类的封装性。因为成员对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  • 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成员对象的唯一方法是通过成员对象的接口。
  • 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的对象。
  • 功能的扩展不会导致类数量的增加

使用「合成复用原则」可以使系统更加灵活,降低类与类之间的藕合度一个类的变化对其他类造成的影响相对较少。

如何使用合成复用原则(How)

合成复用原则,就是把上图改造为下图的过程 :

三、迪米特原则

什么是迪米特原则(What)

迪米特原则,LOD,Law of Demeter
也叫「最少知道原则」,The Least Knowledge Principle
定义:一个对象应该对其他对象保持最少的了解,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。又叫「最少知道原则」。

为什么使用迪米特原则(Why)

可以降低系统的耦合度,一个对象的改变不会给太多其他对象带来影响。

如何使用迪米特原则(How)

只和朋友交流,不和陌生人说话

在迪米特法则中,对于一个对象,其“朋友”包括以下几类:
(1)当前对象本身以及当前对象所创建的对象
(2)当前对象的成员对象,如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友
(3)以参数形式传入到当前对象方法中的对象
任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。

第三者通信法
如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用;如果其中一个对象需要调用另一个对象的方法,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。


参考书籍

[1] 设计模式的艺术 作者:刘伟

软件设计原则之接口隔离原则、合成复用原则、迪米特原则相关推荐

  1. 面试官问你如何进行程序设计?——设计模式之七大原则——接口隔离、合成复用、迪米特法则以及C++设计实现

    设计模式的设计原则之2.0 七大原则 5.接口隔离(InterfaceSegregation Principle,ISP) 5.1.背景 5.2.定义 5.3.特征 5.4.应用 6.迪米特原则(La ...

  2. 六大设计原则之接口隔离原则

    接口隔离原则定义 接口隔离有两种定义: Clients should not be forced to depend upon interfaces that they don't use. 客户端不 ...

  3. 七大设计原则之接口隔离原则应用

    目录 1 接口隔离原则介绍 2 接口隔离原则应用 1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接 ...

  4. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...

  5. 面向对象编程原则(07)——接口隔离原则

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...

  6. 单一职责原则和接口隔离原则区别的理解

    网上对于两者的区别众说纷纭,总是一套理论下来跟没有说一样,下面说说自己的理解:  单一职责原则: 是将某一职责的方法全放在一个接口中,这时候就会出现实现该接口的类必须实现该接口中自己用不到的方法(违背 ...

  7. 朝着理想坚实迈进_坚实原则:接口隔离原则

    朝着理想坚实迈进 以前,我们研究了liskov替代原理. 下一个原则是接口隔离 . 接口隔离原则(ISP)指出,不应强迫任何客户端依赖其不使用的方法. 想象一下,在我们的代码库中有很多方法的接口,尽管 ...

  8. 坚实原则:接口隔离原则

    以前,我们研究了liskov替代原理. 下一个原则是接口隔离 . 接口隔离原则(ISP)指出,不应强迫任何客户端依赖其不使用的方法. 想象一下一个接口,在我们的代码库中有很多方法,尽管只有一部分方法被 ...

  9. Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

    1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...

最新文章

  1. 如何区分直连串口线和交叉串口线?
  2. Matlab读取文本数据
  3. LeetCode 404. 左叶子之和(Sum of Left Leaves)
  4. Leetcode题库 6.Z字形变换(C实现)
  5. windows下安装vundle
  6. Linux Centos安装步骤
  7. 公共技术点之 Java 注解 Annotation
  8. 鸿蒙硬件HI3861开发环境搭建-串口2测试
  9. Pandas 排序之后索引问题
  10. [Ext JS 7]基于NPM的开发
  11. 重构:从方法论到实践
  12. C#——绘制箭头的方法
  13. 网易裁员,让保安把身患绝症的我赶出公司。我在网易亲身经历的噩梦!
  14. 约翰霍普金斯大学计算机专业,美国约翰霍普金斯大学计算机科学专业有哪些介绍...
  15. 《黑白团团队》第七次作业:团队项目设计完善编码
  16. 曾经懵懂少年,曾经年少轻狂
  17. 脸上不同位置长痘痘的原因
  18. MMFNet: A Multi-modality MRI Fusion Network for Segmentation of Nasopharyngeal Carcinoma
  19. 美国诚实签经验——不要抢答,两个人一起签,要让与社会交流多、表达能力强的人为主导,抓住问题核心回答,重要问题回答时补充材料...
  20. 【Linux进程间通信】一、什么是IPC

热门文章

  1. LaTeX新手入门教程
  2. 网络基础-路由器工作原理
  3. RedHatLinux新手入门教程(2)(转)
  4. Peterson‘s算法(并发双线程互斥锁
  5. javascript制作对联广告
  6. 简单方法实现重力感应背景图(GravityImageView)
  7. oracle 常用sql语句
  8. 如何快速的写出原创文章原创内容
  9. 使用google挖掘SQL注入漏洞
  10. android+收不到短信广播,短信广播接收器一直收不到广播,但是有成功注册了Receiver了...