首先看定义:

  1.高层模块不依赖于低层模块,两者都应该依赖于抽象层

  2.抽象不能依赖于细节,细节必须依赖于抽象

首先,模块是个抽象的概念,可以大到一个系统中的子系统作为一个模块,也可以是某个子系统中的组件,也可以是某个组件中的某个类。都可以称为模块。

先看第一条:

  高层依赖于低层模块:是指高层模块需要调用低层模块的方法

再看第二条:

  抽象不能依赖于细节:细节必须依赖于抽象,是指低层模块的方法实现应该是继承于接口,按照接口定义的抽象方法来实现,而不是接口去按照低层模块实现的方法来定义接口

最后:

  两者都应该依赖于抽象层是指:高层的模块调用低层方法的依据是按照抽象层所开放出来的接口去调用,而不是抽象层下面具体的方法实现来调用。低层的模块应该去继承或者去实现抽象层的定义的抽象方法。

举例:

  

<?php
/**
* 驾驶员类
*/
class Player
{
//这里定义了两个相同的方法名,不同参数的方法。这个在java中属于重载,但是PHP中的重载是指的动态的“创建”属性和方法,因此这里只是为了方便理解,PHP并不支持这种重载方式。 /**
* 驾驶福特
* 不好的依赖,Player类的driver方法直接使用了Ford类中的run和stop方法
*/
public function driver(Ford $car)
{
$car->run();//前进
$car->stop();//停止
} /**
* 驾驶奔驰
* 不好的依赖,同上
*/
public function driver(Benz $car)
{
$car->run();
$car->stop();
}
} class Ford
{
public function run()
{
echo 'biu~~';
} public function stop()
{
echo 'duang';
}
} class Benz
{
public function run()
{
echo 'biu~~';
} public function stop()
{
echo 'duang';
}
}

  从上面看,Player的两个驾驶方法都是直接使用了具体的类,如果某个类的方法发生了改变,例如类名发生了改变。那么Player类也要做相应的修改。

良好的依赖:

<?php
/**
* 驾驶员类
*/
class Player
{
//fixme 这里定义了两个相同的方法名,不同参数的方法。这个在java中属于重载,但是PHP中的重载是指的动态的“创建”属性和方法,因此这里只是为了方便理解,PHP并不支持这种重载方式。 /**
* 驾驶福特
* 依赖的是ICar接口,Player类不需要知道$car对象是Ford还是Benz,只要知道这两个品牌的车都实现了ICar接口即可
*/
public function driver(ICar $car)
{
$car->run();//前进
$car->stop();//停止
} /**
* 驾驶奔驰
* 不好的依赖,同上
*/
public function driver(ICar $car)
{
$car->run();
$car->stop();
}
}
  
interface Icar
{
public function run();
public function stop();
}

  
class Ford implements ICar
{
public function run()
{
echo 'biu~~';
} public function stop()
{
echo 'duang';
}
} class Benz implements ICar
{
public function run()
{
echo 'biu~~';
} public function stop()
{
echo 'duang';
}
}

九 DIP 依赖倒置原则的更多相关文章

  1. 六大设计原则(三)DIP依赖倒置原则

    依赖倒置原则DIP(Dependence Inversion Principle) 依赖倒置原则的含义 高层模块不能依赖低层模块,二者都应该依赖其抽象. 抽象不应该依赖于细节. 细节应该依赖抽象. 什 ...

  2. DIP依赖倒置原则

    一.定义 1.高层模块不应该依赖低层模块,二者都应该依赖抽象 2.抽象不应该依赖于细节.细节应该依赖于抽象 二.层次化 1.简单介绍 结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良 ...

  3. 第2章 面向对象的设计原则(SOLID):3_依赖倒置原则(DIP)

    3. 依赖倒置原则(Dependence Inversion Principle,DIP) 3.1 定义 (1)要依赖抽象,不要依赖具体的实现类.简单的说就是对抽象(或接口)进行编程,不要依赖实现进行 ...

  4. 依赖倒置原则(Dependency Inversion Principle)

    很多软件工程师都多少在处理 "Bad Design"时有一些痛苦的经历.如果发现这些 "Bad Design" 的始作俑者就是我们自己时,那感觉就更糟糕了.那么 ...

  5. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...

  6. 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解

    1.概述 所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模 ...

  7. 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解(转)

    所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合 ...

  8. 设计模式值六大原则——依赖倒置原则 (DIP)

    依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象. 依赖倒置 ...

  9. 【面向对象设计原则】之依赖倒置原则(DIP)

    依赖倒转原则(Dependency Inversion  Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...

随机推荐

  1. Meshlab

    打开ply文件的软件,Meshlab. 下载 http://yunpan.cn/cgapukD2La9Se (提取码:37f1) http://pan.baidu.com/s/1pJLnWqJ

  2. redis事务中的WATCH命令和基于CAS的乐观锁

    转自:http://blog.sina.com.cn/s/blog_ae8441630101cgy3.html 在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能. ...

  3. ES6介绍

    1.ES6简介 ECMAScript 6.0,是 JavaScript 语言下一代标准,发布于 2015 年 6 月.它的目标是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业 ...

  4. JS里访问纯数字ID对象时出现问题

    <p id="1">Hello</p> 例如上面的例子,id为纯数字会出错.此时用js去获取该对象会报错,查找不到该对象. 原因:必须是字母开头,或是下划线 ...

  5. Ubuntu 下安装GIMP

    1.Add GIMP PPA Open terminal from Unity Dash, App launcher, or via Ctrl+Alt+T shortcut key. When it ...

  6. C#基础-面向对象-封装

    封装 命名空间 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp6 { c ...

  7. Tomcat+jdk 环境处理 java jsp代码编写web环境的容器

    Tomcat是由 Apache 软件基金会下属的 Jakarta 项目开发的一个Servlet 容器,按照 SunMicrosystems 提供的技术规范,实现了对 Servlet 和 JavaSer ...

  8. python简介,数据类型,input,if语句

      1. python的起源 python的创始人为吉多·范罗苏姆(龟叔Guido van Rossum),1989年的圣诞节期间,龟叔为了在阿姆斯特丹打发时间 决心开发一个新的脚本程序解释器,作为A ...

  9. 《Python语言及其应用》学习笔记

    第二章 ========== 对象的类型决定了可以对它进行的操作.对象的类型还决定了它装着的数据是允许被修改的变量(可变的),还是不可被修改的常量(不可变的). Python是强类型的,你永远无法修改 ...

  10. HAN模型理解1

    HAN 模型 最开始看这个模型是看的这个解释: RNN+Attention(HAN) 文本分类 阅读笔记 - 今天做作业没的文章 - 知乎 https://zhuanlan.zhihu.com/p/4 ...