• 前言

  • 1. 设计原则

    • 1.1. 开-闭原则

    • 1.2. 里氏代换原则

    • 1.3. 依赖倒转原则

    • 1.4. 接口隔离原则

    • 1.5. 合成/聚合原则

    • 1.6. 迪米特法则

前言

学习设计模式之前先要了解其中的设计原则,因为一个系统的设计需要遵守一定的原则,通过这些原则实现具体的设计模式。

设计原则有以下几种:

  • 开-闭原则

  • 里氏代换原则

  • 依赖倒转原则

  • 接口隔离原则

  • 合成/聚合复用原则

  • 迪米特法则

1. 设计原则

1.1.  开-闭原则

开闭原则指一个软件实体应当对扩展开发,对修改关闭。因此在设计一个模块时,应当使这个模块可以在不被修改的前提下被扩展。

满足开闭原则的设计可以提高系统的优越性:通过扩展已有的软件系统可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的使用性和灵活性;已有的软件模块特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统具有一定的稳定性和延续性。

如何实现开闭原则:

  • 首先就是抽象化,在Java中可以给出一个或者多个抽象类或者接口,规定所有的类必须提供特征作为类的抽象层。也就是我们平时实现的接口或者抽象类,在接口或者抽象类中实现可能的方法,在需要扩展时不需要改变接口或者抽象类,只需要实现接口或者继承抽象类,并且重写其中的方法即可,这样就做到对扩展关闭对修改开放。

  • 第二个方面就是封装:封装指的是对可变性的封装,可以理解为找到一个系统的可变因素将之封装起来。在Java中继承就是一种封装,对于继承我们会将一些会通用的因素封装成一个对象,而需要用到时只要继承该对象即可。因此继承应当被看做是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象的方法。同时泛型也可以理解为一种封装,在使用泛型时会不固定类型,那么这样就可以通过泛型的封装得到泛型类,从而实现想要的类型。

  • 以上的抽象化以及封装都是对开闭原则的一种体现,这种方法保证了开闭原则中对扩展关闭对修改开放的原则。

1.2.  里氏代换原则

里氏代换原则可以解释为任何基类可以出现的地方,子类一定可以出现。对于这句话的理解可以结合开闭原则中的继承来理解,在Java中继承保证了基类与子类的关系,所以继承就是抽象化的具体体现。因此可以把里氏代换原则理解为对开闭原则中抽象化的具体实现。

因此要是违反了里氏代换原则那么就一定违反了开闭原则。

1.3.  依赖倒转原则

依赖倒转原则解释为要依赖于抽象而不是依赖于实现。这句话的理解可以结合Java中抽象类或者接口,当一个类实现了某个接口或者继承了某个抽象类时,那么这个类就是实现类,而我们依赖的就是实现类的上一层的抽象类或者接口,如果有其它类需要重新实现方法时,不能依赖实现类,而是要依赖抽象类。

例如有一个接口A,B类实现了接口A并重写了其中的方法,此时有一个C类,那么C类需要实现接口A,而不能继承B类,如果继承B类,那么就违反了依赖倒转原则。因为如果继承B类,那么就违反了开闭原则。

1.4.  接口隔离原则

该原则可以从字面进行理解,就是对接口的隔离,这个原则主要是为客户端提供尽可能小的单独的接口,而不要提供大的总接口。

比如平时开发时需要对外暴露接口时需要对接口进行一定的隔离策略,只暴露对外需要的接口,而将一些不需要暴露的接口进行隔离。因此对于接口隔离原则的理解是对系统通信的限制,这种原则限制系统对外通信尽可能的窄,防止对外暴露过多的通信。这样就保证了系统在功能扩展过程中不会将修改的压力传递到其它的对象。

1.5.  合成/聚合原则

合成/聚合复用原则的目的就是要求尽量使用合成/聚合,而不是继承关系达到复用的目的。合成/聚合就是UML中的两种关系,合成是一种最强的关联关系,并且合成类中可以对附属的类进行控制,也就是在合成关系中需要分清整体类与个体类,而聚合则是次一级的关联关系,聚合关系中都是个体类,个体类聚合可以组成一个整体。

因此合成/聚合复用原则与里氏代换原则是相辅相成的,两者都是对开闭原则具体步骤的规范。合成/聚合原则要求设计师在设计时首先考虑合成/聚合关系,而里氏代换原则要求在使用继承关系时,必须确定这个关系是符合一定条件的。这里可以理解为有关联的才需要使用继承,不能随便以及盲目的继承。

1.6.  迪米特法则

迪米特法则的理解为一个软件实体应当尽可能少的与其它实体发生相互作用。对于这个可以理解为平时在使用一些类时尽可能的不要跟其它类进行相关联,而每个实体类尽量相互独立,这样在后续的功能扩展时如果要修改该类,那么对其它模块也不会产生影响。

如果一个类关联了多个类,那么该类修改可能就会导致影响其它功能模块,造成整个系统的不稳定性。同时保证了系统在功能扩展时能够容易的做到对修改的关闭。


参考资料:

1、《Java与模式》

带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)相关推荐

  1. 里氏代换和依赖倒转原则(二)

    上节说到开闭原则的关键是抽象化,有了抽象化就要有具体化,从抽象化到具体化的过程,其实也是一个继承关系确立的过程.无论是"实现继承"还是"接口继承",在这个过程中 ...

  2. 面向对象软件设计原则【JAVA】(开闭原则、里氏代换、依赖倒转、接口隔离、迪米特法则、合成复用原则)

    软件设计原则[JAVA](开闭原则.里氏代换.依赖倒转.接口隔离.迪米特法则.合成复用原则) 1.开闭原则 2.里氏代换原则 3.依赖倒转原则 4.接口隔离原则 5.迪米特法则 6.合成复用原则 1. ...

  3. 设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)...

    原文:设计模式原则(单一.开放封闭.里氏代换.依赖倒转.迪米特法则五大原则) 单一职责原则 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因.   如果一个类承担的职责过多,就等于把这些职责耦 ...

  4. Java设计模式:1.1.认识六个原则(开闭,里氏替代,依赖颠倒)

    Hello,各位,好久没发布内容了,现在转做Java语言,目前基础已经学习一大半,正在钻研设计模式,第一天开始学习,废话不多说,走起!!! 我个人比较喜欢先概念再实战,这样可以提高自己在敲代码中的思维 ...

  5. 从零开始学习Java设计模式 | 软件设计原则篇:依赖倒转原则

    在本讲,我将为大家介绍软件设计原则里面的第三个原则,即依赖倒转原则. 概述 什么是依赖倒转原则呢?我们来看一下下面这段描述: 高层模块不应该依赖低层模块,两者都应该依赖其抽象:抽象不应该依赖细节,细节 ...

  6. 面向对象软件设计的“开—闭”原则

    1.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  7. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

  8. 六大设计原则--开闭原则

    定义 software entities like classes, modules and functions should be open for extension but closed for ...

  9. 一周技术学习笔记(第67期)-CPU的设计跟开闭原则有关系吗

    你能想到CPU的设计是开闭原则的设计吗 说CPU的设计很符合软件设计的开闭原则,估计一般的同学肯定不会这样意识到.其实我也一样不太可能把它们能够想在一起,并将它们关联起来. 可确实就这样发生了.实际上 ...

最新文章

  1. 第15章节-Python3.5-Django实现用户登录与前端交互2 14
  2. 电脑无线网络显示红叉_不能播放视频怎么办?小编教你电脑不能播放视频如何解决...
  3. HTML5日期输入类型
  4. VMprotect简介
  5. Google Maps API编程资源大全
  6. 九、“行胜于言车胜马,负重致远向前途”
  7. 网站正在建设中提示页面设计欣赏
  8. ACL初识(访问控制列表)
  9. Codeigniter 3 拓展HMVC
  10. 去除vue项目中的#及其ie9兼容性
  11. Python学习笔记之Windows下通过pip安装Django详细介绍
  12. redis系列:redis介绍与安装
  13. .Net快速获取网络文本文件最后一段文字-小应用
  14. 和大家分享一下我最近的编程心得!!!
  15. MFC 单文档应用程序 dialog 变量传递
  16. 单价数量和总价的公式_小学数学量的计算单位及常用公式表
  17. SignalR入门之Hub
  18. 菜鸟使用RedHat Linux9.0极品笑话
  19. 虚拟机配置--网络、MySQL数据库、JDK环境变量
  20. leet code 006:ZigZag Conversion

热门文章

  1. git操作后的各种后悔情况解决
  2. 数字摄影测量考试复习名词解释
  3. 100量子比特量子计算机,51量子比特模拟器问世,大规模量子计算机迈出重要一步...
  4. python:pandas全DataFrame查询定位赋值数值所在行列
  5. JavaScript 入门(一)
  6. 手机处理器排行榜2019_2019十大手机读书软件排行榜
  7. android 浏览器源码分析,android webview 简单浏览器实现代码
  8. 计算机专业课考研都有哪些,计算机专业考研的课程有哪些
  9. android qq登录分析,Android第三方登录之QQ登录
  10. 352记--扬哥本纪