依赖倒转原则简述

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. SpringBoot使用JMS(activeMQ)的两种方式 队列消息、订阅/发布

    刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用 1.下载ActiveMQ 地址:http://activemq.apache.org/ ...

  2. TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?

    引 言 这是一个系列文章,我们将在本系列中探索Rancher使用TLS证书的不同方式.TLS,安全传输层协议,是用于保护网络通信的加密协议.它是目前已经弃用的安全套接层(SSL)的继任者. 你可以从本 ...

  3. 【论文笔记系列】AutoML:A Survey of State-of-the-art (上)

    之前已经发过一篇文章来介绍我写的AutoML综述,最近把文章内容做了更新,所以这篇稍微细致地介绍一下.由于篇幅有限,下面介绍的方法中涉及到的细节感兴趣的可以移步到论文中查看. 论文地址:https:/ ...

  4. 7.场景5:使用Linux桥的VRRP(L3HA)的高可用性

    此场景描述了使用ML2插件和Linux网桥的OpenStack网络服务的高可用性实现. 他的高可用性实施例增强了这样的场景:具有Linux网桥架构的传统使用了keepalived的虚拟路由器冗余协议( ...

  5. ThreadLocal源码分析-黄金分割数的使用

    前提 最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量.问题是解决了,但是后来发现对T ...

  6. 从数组中找到topK的元素(序号)

    问题: 在n个数中找出最大的k个数. 多次求min()或求max() 最简单的方法是对大小为k的数组进行n次求min计算(或者对大小为n的数组进行k次求max计算)最后能够找出最大k个数.复杂度是O( ...

  7. Codeforces Global Round 3(A-D)

    我凉了..感觉自己啥都不会做,搞不好起床就绿了啊 代码和反思起床补,今天要反了个大思的 A. Another One Bites The Dust 把所有的ab排在一起然后两边叉a和b #includ ...

  8. codeforces 1025B Weakened Common Divisor(质因数分解)

    题意: 给你n对数,求一个数,可以让他整除每一对数的其中一个 思路: 枚举第一对数的质因数,然后暴力 代码: #include<iostream> #include<cstdio&g ...

  9. 教你如何快速上手markdown语法,编写技术博客(史上最全最简,用MarkDown写博客)

    首先,进行有道云笔记官网,新建一份markdown文档, 如下图 然后,在文档编辑区,左边,复制如下段落文字 加粗 斜线 标记颜色 下划线 废弃线 一级标题 二级标题 三级标题 四级标题 五级标题 六 ...

  10. 不同宿主的iterator不能进行比较

    int main() { string str1, str2; auto it1 = str1.begin(), it2 = str2.begin(); it1 == it2; ; }