依赖倒转原则简述

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

2.抽象不应该依赖细节,细节应该依赖抽象

3.依赖倒转得中心思想时面向接口编程

4.依赖倒转原则时基于这样得设计理念:相对于细节得多变性,抽象得东西要稳定得多。以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定得多。在java中,抽象指的时接口或是抽象类,细节就是具体得实现类

5.使用接口或抽象类的目的时规定好规范,而不涉及任何具体操作,把展现细节的任务交给他们的实现类完成

依赖倒转原则的三种实现方式

1.接口传递

2.构造方法传递

3.setter方式传递

应用实例

没有使用依赖倒转原则

public class DependecyInversion {
public static void main(String[] args) {
Person p = new Person();
p.receive(new Email());
}
} /*
* 完成Person接收消息的功能
*方式1分析
*1. 简单,比较容易想到
*2. 如果我们获取的对象是微信,短信等等,则新增类,同时Person类也要增加相应的接受方法
*3.解决思路:引入一个抽象的接口IReceiver,表示接收者,这样Person类 与接口IReceiver发生依赖
*因为Email,微信,等等属于接收的范围,他们各自实现IReceiver接口就ok了,这样我们就符合依赖倒转原则
*/
class Email{
public String getInfo() {
return "电子邮件信息:hello, world";
}
}
class Person{
public void receive(Email email) {
System.out.println(email.getInfo());
}
}

接口传递

public class DependecyInversionTest {
public static void main(String[] args) {
//方法1,通过接口实现
ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
OpenAndClose openAndClose = new OpenAndClose(); //创建OpenAndClose类的对象
openAndClose.open(changHong); //通过接口实现
}
} //方式1:通过接口传递依赖
interface IOpenAndClose {
public void open(ITV tv);
} interface ITV {
public void play();
} class OpenAndClose implements IOpenAndClose{
public void open(ITV tv) {
tv.play();
}
} class ChangHong implements ITV{
public void play() {
System.out.println("打开");
}
}

构造方法传递

public class DependecyInversionTest {
public static void main(String[] args) {
//方法2,通过构造器实现
ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
OpenAndClose openAndClose= new OpenAndClose(changHong); //创建OpenAndClose类的对象
openAndClose.open(); //通过构造器实现
}
} //方式2,通过构造方法依赖传递
interface IOpenAndClose {
public void open();
} interface ITV{
public void play();
} class OpenAndClose{
public ITV tv;
public OpenAndClose(ITV tv) {
this.tv = tv;
}
public void open() {
this.tv.play();
}
} class ChangHong implements ITV{ @Override
public void play() {
// TODO Auto-generated method stub
System.out.println("打开");
} }

setter方式传递

public class DependecyInversionTest {
public static void main(String[] args) {
//方法3,通过setter方式实现
ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
OpenAndClose openAndClose = new OpenAndClose(); //创建ChangHong类的对象
openAndClose.setTV(changHong); //通过setter方式传递
openAndClose.open(); //调用open()方法
}
} //方式3,通过setter方法传递
interface IOpenAndClose{
public void open();
} interface ITV{
public void play();
} class ChangHong implements ITV{
public ITV tv;
public void play() {
System.out.println("打开");
}
} class OpenAndClose implements IOpenAndClose{
public ITV tv;
public void setTV(ITV tv) {
this.tv = tv;
}
public void open() {
this.tv.play();
}
}

java设计模式学习笔记--依赖倒转原则的更多相关文章

  1. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  2. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  3. java设计模式学习笔记--开闭原则

    基本介绍 1.开闭(ocp)原则时编程中最基础.最重要的设计原则 2.一个软件实体如类.木块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节.即对提供方开放,对使用方关闭. 3.当软件 ...

  4. java设计模式学习笔记——里氏替换原则

    oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...

  5. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  6. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  7. Java设计模式学习笔记(五) 单例模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...

  8. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  9. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

随机推荐

  1. ROS之服务

    服务(service)是另一种在节点之间传递数据的方法,服务其实就是同步的跨进程函数调用,它能够让一个节点调用运行在另一个节点中的函数. 我们就像之前消息类型一样定义这个函数的输入/输出.服务端(提供 ...

  2. ipwry源码

    qqwry.ipwry都是cnss(http://blog.csdn.net/cnss/article/details/136069)出品,终于找到了源码,下载地址:http://download.c ...

  3. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型——AttributeError: module ‘tensorboard' has no attribute 'lazy'

    转载自:CSDN Nine-days   近日,Intel 开源了一个用于神经网络压缩的开源 Python 软件包 Distiller,它可以减少深度神经网络的内存占用.加快推断速度及节省能耗.Dis ...

  4. Go语言实现:【剑指offer】平衡二叉树

    该题目来源于牛客网<剑指offer>专题. 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. ...

  5. 安装symfony3.4的坑,也是PHP7.3的经典坑之解决办法

    对于刚入手symfony3.4的同学,肯定会发现,安装symfony后部署后看到的往往不是hello world,也不是symfony的欢迎页面,而是给你一个下马威,唉,给你来个bug开开胃. 当然这 ...

  6. Robot Framework自动化测试框架核心指南-如何使用Java编写自定义的RobotFramework Lib

    如何使用Java编写自定义的RobotFramework Lib 本文包括2个章节 1. Robot Frdamwork中如何调用java Lib库 2.使用 java编写自定义的Lib 本文作者为: ...

  7. [1天搞懂深度学习] 读书笔记 lecture I:Introduction of deep learning

    - 通常机器学习,目的是,找到一个函数,针对任何输入:语音,图片,文字,都能够自动输出正确的结果. - 而我们可以弄一个函数集合,这个集合针对同一个猫的图片的输入,可能有多种输出,比如猫,狗,猴子等, ...

  8. Apache缓存相关配置

    小编今天来总结下 apache的缓存模块相关信息 硬盘缓存:mod_disk_cache,依赖 mod_cache 模块 内存缓存:mod_mem_cache,依赖 mod_cache 模块 文件缓存 ...

  9. 制作openstack的windows server 2012r2镜像

    1. 基础环境安装 yum groupinstall Virtualization "Virtualization Client" yum install libvirt 2. 启 ...

  10. 杭电-------2053Switch Game(C语言)

    /* 题目大意是指:有n个灯泡,按1-n编号,要操作n次,第i次操作是将标号是i的倍数的变成相反状态.最终求得是n次操作后,编号为n的灯泡的状态,其实就是求n的约束有多少个,及灯泡n被操作了多少次*/ ...