设计模式之禅之六大设计原则-依赖倒置原则

依赖倒置原则
依赖倒置原则的原始定义是:
● 高层模块不应该依赖低层模块,两者都应该依赖其抽象;
● 抽象不应该依赖细节;
● 细节应该依赖抽象。

那什么是抽象?什么又是细节呢?
---->在Java语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化,也就是可以加上一个关键字new产生一个对象。依赖倒置原则在Java语言中的表现就是:

● 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过
接口或抽象类产生的;
● 接口或抽象类不依赖于实现类;
● 实现类依赖接口或抽象类。更加精简的定义就是“面向接口编程”——OOD(Object-Oriented Design,面向对象设
计)的精髓之一。

依赖倒置的优点
---->减少类间的耦合性
---->提高系统的稳定性
---->降低并行开发引起的风险
---->提高代码的可读性和可维护性。

证明一个定理是否正确,有两种常用的方法:一种是根据提出的论题,经过一番论证,推出和定理相同的结论,这是顺推证法;还有一种是首先假设提出的命题是伪命题,然后推导出一个荒谬、与已知条件互斥的结论,这是反证法。我们今天就用反证法来证明依赖倒置原则是多么优秀和伟大


论题:依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
反论题:不使用依赖倒置原则也可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

Driver类
package com.yeepay.sxf.sj4;

/**
 * 司机
 * @author sxf
 *
 */
public class Driver {

        public void dirverCar(Benchi benchi){
                System.out.println("Driver.dirverCar(人开车)");        
                benchi.run();
        }
}
Car类
package com.yeepay.sxf.sj4;
/**
 * 奔驰
 * @author sxf
 *
 */
public class Benchi {

        public void run(){
                System.out.println("Benchi.run(奔驰奔跑)");
        }
}
Client类
        public static void main(String[] args) {
                Benchi vBenchi=new Benchi();
                Driver diiDriver=new Driver();
                diiDriver.dirverCar(vBenchi);
        }
(1)如果人再想开宝马,则不灵活。耦合度大。抽象,面向接口编程,可以降低耦合度。
(2)大型项目。人分模块开发。高模块,不需要等待低模块开发完成,才能开发。只需要低模块的接口即可。

抽象是对实现的约束,对依赖者而言,也是一种契约,不仅仅约束自己,还同时约束自己与外部的关系,其目的是保证所有的细节不脱离契约的范畴,确保约束双方按照既定的契约(抽象)共同发展,只要抽象这根基线在,细节就脱离不了这个圈圈,始终让你的对象做到“言必信,行必果”。

依赖的三种写法
第一:构造函数传递依赖对象
第二:Setter方法传递依赖对象
第三:接口声明依赖对象

最佳实践
依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合,我们怎么在项目中使用这个规则呢?只要遵循以下的几个规则就可以:
● 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
        -->这是依赖倒置的基本要求,接口和抽象类都是属于抽象的,有了抽象才可能依赖倒置。
● 变量的表面类型尽量是接口或者是抽象类
        -->很多书上说变量的类型一定要是接口或者是抽象类,这个有点绝对化了,比如一个工具
类,xxxUtils一般是不需要接口或是抽象类的。还有,如果你要使用类的clone方法,就必须
使用实现类,这个是JDK提供的一个规范。
● 任何类都不应该从具体类派生
        -->继承不得到超过两层。事无绝对。但可以追求完美。
● 尽量不要覆写基类的方法
        -->如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不要覆写。类间依赖的是抽象,覆写了抽象方法,对依赖的稳定性会产生一定的影响。
● 结合里氏替换原则使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax改变json指向,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)

废话不多说了&#xff0c;直接给大家贴代码了&#xff0c;具体代码如下所示&#xff1a;$.ajax({url: "/business/findpersons.json",dataType: "json",type:"GET",success: function(doc) {var objseval(doc);for (var i 0; i < objs.lengt…

***使用PHP实现文件上传和多文件上传

http://www.365mini.com/page/php-upload-file.htm 在PHP程序开发中&#xff0c;文件上传是一个使用非常普遍的功能&#xff0c;也是PHP程序员的必备技能之一。值得高兴的是&#xff0c;在PHP中实现文件上传功能要比在Java、C#等语言中简单得多。下面我们结合具体的代码实例来详…

ajax 如何使 dropdownlist 无刷新,Jquery实现无刷新DropDownList联动实现代码

先看HTML,我们引用Jquery,放两个DropDownList:#ddlEmployeeCars{display:none;position:absolute;top:50px;left:9px;}接着写核心的Script:$(function() {var $ddl $("select[name$ddlEmployee]");var $ddlCars $("select[name$ddlEmployeeCars]");$ddl.…

famous javascript library.

https://famo.us/ THE ULTIMATE WEB PLATFORM FOR DEVELOPERS AND DESIGNERS转载于:https://www.cnblogs.com/feika/p/4382525.html

MyEclipse/Eclipse 中使用javap

-c -classpath ${workspace_loc}\${project_name}\bin ${java_type_name} 特别强调我所掉过的一个坑&#xff1a;这行配置bin后面空一格而非\&#xff0c;就这个小问题让我吃了苦头 有知道原因的望告知。。。。。。。真想了解原因 转载于:https://www.cnblogs.com/blueFlowers…

怎样王远端服务器上传文件,传王电子传真使用指南-Freefax传真服务器,传王A6,免费传真...

接线方案传王A6品牌宣传为『传王&#xff0c;最棒的&#xff01;传王&#xff0c;传真之王。』,并不是一句空泛的宣传。传王A6充分考虑用户的办公环境&#xff0c;能与电话很好地混合使用&#xff0c;通过不同的接线方案&#xff0c;配合丰富的权限管理和系统设定&#xff0c;满…

《梦断代码》阅读笔记之第8章至最后

以下是我读了梦断代码第八章之后的读书笔记&#xff1a; 1.自己做的软件自己一定要用&#xff0c;即“吃你自己的狗食”&#xff0c;自己的软件开发出来后自己都不会用那么还要指望别人用不成&#xff1f; 2.在软件开发编写代码的时候&#xff0c;当你把系统的一块新部件放进去…

《JavaScript高级程序设计》chapter 1: javascript 简介

1.2.2 文档对象模型DHTML的出现让开发人员无需重新加载页面就可以修改其外观了。1.2.3 浏览器对象模型&#xff08;BOM&#xff09;BOM真正与众不同的地方在于他作为javascript实现的一部分&#xff0c;但是却没有相关的标准。这些问题咋html5中得到解决。人们习惯上把所有针对…

nginxlua文件服务器权限,通过lua进行nginx的权限控制

nginx_lua的安装nginx使用luajit进行编译安装使用openresty进行yum安装openresty中将lua和nginx进行封装&#xff0c;详情可查看openresty官网openresty相关启动命令service openresty startngx_lua的相关api使用说明及相关使用ngx_lua的日常使用场景ngx_lua的执行顺序&#xf…

WINCC访问OPC服务器显示叹号,本机浏览opcserver.wincc ,无法打开-工业支持中心-西门子中国...

WinCC OPC服务器和OPC客户机之时的数据交换通过DCOM进行。安装WinCC后&#xff0c;WinCC OPC服务器的DCOM要设置正确。如下情况设置必须改变&#xff1a;? 如果登记到OPC客户机或服务器计算机的用户没有管理员员限? 如果用不同于OPC客户机的帐号登记OPC服务器。注意下列说明描…

CSS3 选择器 基本选择器介绍

CSS是一种用于屏幕上渲染html&#xff0c;xml等一种语言&#xff0c;CSS主要是在相应的元素中应用样式&#xff0c;来渲染相对应用的元素&#xff0c;那么这样我们选择相应的元素就很重要了&#xff0c;如何选择对应的元素&#xff0c;此时就需要我们所说的选择器。选择器主要是…

逆水寒7月19服务器维护,逆水寒7月19日更新维护公告 更新内容汇总

3. 战斗体验优化&#xff1a;1) 优化了动作模式下Alt数字快捷键选择队友的操作&#xff0c;我们已经安排大量策划专注使用3D模式和动作模式&#xff0c;后续将继续优化部分技能在3D模式下的易用性。2) 大幅提升部分日常副本的可视距离&#xff0c;现在可看到更远处的…

Linux下ejabberd安装配置

为什么80%的码农都做不了架构师&#xff1f;>>> Linux下ejabberd安装配置 1、下载Ejabberd安装包 wget http://www.process-one.net/downloads/ejabberd/2.1.13/ejabberd-2.1.13-linux-x86_64-installer.run 也可以在直接在官网上下载 ejabberd-15.11-linux-x86…

unity5, custom PBS shader

unity5中引入了基于物理着色(PBS)的Standard shader。由于这种着色器通过调节参数和贴图可逼真模拟各种硬质表面&#xff0c;所以不必再像unity4时代那样需要对各种质感材质单独编写着色器&#xff0c;而且能得到更好的效果(参考&#xff1a;http://docs.unity3d.com/Manual/sh…

win服务器文件夹权限设置密码,win服务器 文件夹权限设置

win服务器 文件夹权限设置 内容精选换一换开发过程中&#xff0c;您有任何问题可以在github上提交issue&#xff0c;或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。在OBS中&#xff0c;用户操作的基本数据单元是对象。OBS PHP SDK…

Java定时任务以及ScheduledThreadPoolExecutor需要注意的问题

Java提供Timer和ScheduledThreadPoolExecutor两个类实现定时任务&#xff0c;其中Timer简单易用&#xff0c;但所有任务都是由同一个线程来调度&#xff0c;任务串行执行&#xff0c;任务之间存在互相干扰&#xff0c;一是前一个任务的延迟会导致后面的任务延迟&#xff0c;二是…

重启php-fpm的方法

ps -ef|grep "php-fpm: master process"|grep -v grep|awk {print $2}|xargs kill -USR2 优点&#xff1a;简单&#xff0c;无需写脚本。无需依赖其他工具缺点&#xff1a;不能区分池子&#xff0c;不够精准转载于:https://www.cnblogs.com/yaoyi/p/4398636.html

手机文件管理ftp服务器,ftp工具手机版(ftp文件传输管理工具)V1.0.2 手机版

ftp工具手机版(ftp文件传输管理工具)是一款非常实用的ftp文件管理应用工具。主要作用是将手机ftp上的文件数据快速传输到电脑上&#xff0c;或者将电脑上的文件传输到手机上&#xff0c;实现双向传输&#xff0c;并且传输速度十分快&#xff0c;ftp工具是一款很专业的传输软件&…

Android 获得ImageView中Image的绘制大小

2019独角兽企业重金招聘Python工程师标准>>> ImageView在显示图片的时候&#xff0c;受限于屏幕大小&#xff0c;和图片宽高。通常图片是被缩放过&#xff0c;且不是宽和高都充满ImageView的。 此时&#xff0c;我们如何获得Image被实际绘制的宽高呢&#xff1f; //…

Quartz2D指定显示范围

在qq中&#xff0c;可以看到头像是圆形显示的&#xff0c;通过CGContextClip可以设置 CGContextRef contextUIGraphicsGetCurrentContext();CGContextAddEllipseInRect(context, CGRectMake(100, 100, 100, 100));CGContextClip(context);UIImage *img[UIImage imageNamed:&quo…