首先看定义:

  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. using System.Security.Cryptography

    这个命名空间主要是用来进行加密的一些类. 加密服务: 公共网络(如 Internet)不提供实体之间安全通信的方式. 此类网络上的通信易被读取或甚至被未经授权的第三方修改. 加密有助于防止数据被查看, ...

  2. fine ui grid控件添加行号

    grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...

  3. 你的 maven 如何使用

    maven把你从痛苦的找包中解脱,让你感觉如此神奇,也让你的项目能够如此之小--功能一 依赖管理  (pom.xml 项目对象模型配置文件) 没有对比就没有伤害 maven让你可以随意增加删除项目的功 ...

  4. SVProgressHUD–比MBProgressHUD更好用的 iOS进度提示组件

    简介 SVProgressHUD是简单易用的显示器,用于指示一个持续进行的任务的进度. 项目主页: SVProgressHUD 最新示例: 点击下载 快速入门 安装 通过Cocoapods pod ' ...

  5. OCCI的迭代修改

    传统的在执行多行DML(INSERT.UPDATE.DELETE)时,我们是多次调用executeUpdate():注意!当我们调用一次此函数时,则执行一次网络往返,当数据量大时则效率非常低.不过 O ...

  6. RabbitMQ安装---rpm安装

    首先介绍一下个人的安装环境是Linux-centos7: 一.安装和配置rabbitmq的准备工作: 下载erlang:    wget http://www.rabbitmq.com/release ...

  7. 百度站长针对SEO人员关系的问题的一些解答

    自然排名是全部由机器完成还是存在人工干预? 夫唯:第一个就是说经常好不容易找到了一些新的想法,用我们这些草根的话讲找到了百度的漏洞,好不容易排名上去了,过两天就会波动.有些人就怀疑说在百度的整体算法里 ...

  8. vue组件封装及父子组件传值,事件处理

    vue开发中,把有统一功能的部分提取出来,作为一个独立的组件,在需要使用的时候引入,可以有效减少代码冗余.难点在于如果封装,使用,如何传参,派发事件等,我会采取倒叙的方式进行说明.(本文总结于Vue2 ...

  9. 一个操作轻松截取长图,Win10上网截长图小技巧!

    截屏的方法有很多,但是有时候我们会遇到比电脑屏幕还大的图,比如网站上的长图.N条引用的评论...你要怎么截取呢?是不是最多只能截全屏?还是要做到第三方的截图软件呢? 下面介绍一种win10电脑自带的滚 ...

  10. JQ实现下拉加载更多

    var x=0; var isloading=0; function getUsersLimited(data) { list = list.concat(data); buildList(list) ...