"开-闭"原则是我们OOD的目标,达到这一目标的主要机制就是"依赖倒转原则".这个原则的内容是:要依赖于抽象,不要依赖于具体.
对于抽象层次来说,它是一个系统的本质的概括,是系统的商务逻辑和宏观的,战略性的决定,是必然性的体现;具体的层次则是与实现有关的算法和逻辑,一些战术性的决定,带有相当大的偶然性.传统的过程性系统设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次.这实际上就是微观决定宏观,战术决定战略,偶然决定必然.依赖倒转原则就是要把这种错误的依赖关系倒转过来.
许多的建构设计模型,例如COM,CORBA,JavaBean,EJB等,它们背后的基本原则就是DIP.
对于软件设计的两个目标,复用和可维护性来说,传统的设计侧重于具体层次模块的复用和可维护,比如算法,数据结构,函数库等等.但是,对系统的抽象是比较稳定的,它的复用是很重要的,同时,抽象层次的可维护性也应当是一个重点.就是说DIP也导致复用和可维护性的"倒转".
我们现在来看看依赖有几种,依赖也就是耦合,分为下面三种
1.零耦合(Nil Coupling)关系,两个类没有依赖关系,那就是零耦合.
2.具体耦合(Concrete Coupling)关系,两个具体的类之间有依赖关系,那么就是具体耦合关系,如果一个具体类直接引用另外一个具体类,就会发生这种关系.
3.抽象耦合(Abstract Coupling)关系.这种关系发生在一个具体类和一个抽象类之间,这样就使必须发生关系的类之间保持最大的灵活性.
DIP要求客户端依赖于抽象耦合,抽象不应当依赖于细节,细节应当依赖于抽象(Abstractions should not depend upon details. Details should depend upon abstractions),这个原则的另外一个表述就是"四人团"强调的那个:要针对接口编程,不要对实现编程.(Program to an interface, not an implementation),程序在需要引用一个对象时,应当尽可能的使用抽象类型作为变量的静态类型,这就是针对接口编程的含义. DIP是达到"开-闭"原则的途径.
要做到DIP,用抽象方式耦合是关键.由于一个抽象耦合总要涉及具体类从抽象类继承.并且需要保证在任何引用到某类的地方都可以改换成其子类,因此,LSP是DIP的基础.DIP是OOD的核心原则,设计模式的研究和应用都是用它作为指导原则的.DIP虽然强大,但是也很难实现.另外,DIP是假定所有的具体类都会变化,这也不是全对,有些具体类就相当稳定.使用这个类的客户端就完全可以依赖这个具体类而不用再弄一个抽象类.
分享到:
相关推荐
### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...
根据给定文件的信息,我们可以提炼出以下相关的高级面向对象(OO)方法论及需求工程的知识点: ### 一、需求工程概述 #### 1. 为什么捕获需求很困难? - **用户认知不足**:用户可能无法清晰地表达他们的需求,...
### OO设计原则——里氏替换原则详解 #### 一、引言 面向对象设计原则(Object-Oriented Design Principles)是一套指导软件开发者如何更好地设计类、接口等面向对象元素的原则集合,旨在提高代码的可复用性、可...
在"oo1-LCM1602-jiale.zip"压缩包中,包含了作者调试成功的LCM1602工程。这通常包括了驱动代码、配置文件、库函数以及必要的电路设计资料。通过这个工程,开发者可以直接应用到自己的STM32项目中,节省了大量的调试...
转到OO 通过CLI进行HP OO操作先决条件HP OO 10.x Central已安装并正在运行去设置安装去获取-u -t -v github.com/dorsha/go2oo (或下载为.zip / .tar.gz) 进行构建(从根目录)用法go2oo.exe --help 显示已部署的...
ex2-fishee82oo-submit-history.zip
标题中的"ruby-oo-fundamentals-attribute-accessors-lab-sea01-seng-ft-07132"表明这是一个关于Ruby面向对象基础的实验,重点是属性访问器(Attribute Accessors)。在这个实验室中,可能涉及到如何在Ruby类中定义...
标题中的“prototypal-oo-js-object-oriented-constructor-functions-lab-onlin”表明这是一个关于JavaScript中原型式面向对象编程(Prototype-based Object-Oriented Programming)的实验或练习,特别是涉及构造...
标题 "ruby-oo-fundamentals-attribute-accessors-lab-wdc01-seng-ft-06012" 暗示我们正在讨论一个关于Ruby面向对象基础的实验,特别是关于属性访问器(attribute accessors)的主题。描述中的 "ruby-oo-...
"oo-test-case-prioritization-by-genetic.rar_software testing"这个标题暗示了这是一个关于面向对象应用程序测试案例优先级确定的项目,它利用了遗传算法来实现这一目标。遗传算法是一种受到生物进化过程启发的...
OO 真经——关亍面向对象的哲学体系及科学体系的探讨
《88oo PartitionExpert 2003:深入解析硬盘分区管理工具》 在计算机领域,硬盘分区是管理和组织硬盘空间的重要方式。88oo PartitionExpert 2003是一款针对个人用户和小型企业的专业分区软件,它为用户提供了一套...
本项目"oojs-grocery-list"就是这样一个实例,它利用Angular JS的核心理念,帮助我们创建一个简单的购物清单应用。 首先,我们需要了解Angular JS的基本概念。Angular JS是基于MVC(Model-View-Controller)设计...
### SAP-ABAP-OO 实现 CL-SALV-TABLE 的关键知识点 #### 1. ABAP 面向对象的 ALV 显示方法 在 SAP 的 ABAP 环境中,ALV (Application List Viewer) 是一种非常常用的技术,用于在屏幕上以表格的形式展示数据。传统...
【标题】"ooop-2020-2021-semester-2"很可能代表一个教育项目或课程,可能是在线开放操作课程(Open Online Operation Program)的2020至2021学年第二学期的教学资料。这个标题暗示了我们可能会探讨计算机科学、编程...
对于UML有个大体的了解,但是如果想系统的学习那么大象去
标题和描述中提到的“23种设计模式,OO思想”,是软件工程领域的一个核心概念,尤其是对于面向对象编程(Object-Oriented Programming,简称OO)的深入理解和实践至关重要。设计模式是由Erich Gamma、Richard Helm、...
标题中的"dev-license-CD5L3-5K9OO-U7UXV-06HLC-9RQN.zip"似乎是一个开发环境相关的授权文件压缩包。通常,这样的命名方式暗示了它包含了一些软件开发工具或者框架的许可证信息。"CD5L3-5K9OO-U7UXV-06HLC-9RQN"可能...
Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 2. **容器化**:Docker-oo 源码中的关键概念是容器化,这是一种轻量级的虚拟化技术,...
共三个文件 1:main.def.js: 树数据结构定义 ... main.Impl.js中的图片自己去找,图片文件名可以不一样,不要修改前面的NAMES BOTTOM:"<IMG src=imgs/WindowsExplorer/nodeBottom.gif>" 适用:IE8 FireFox3.6.X ...