Java设计模式 | 七大原则之依赖倒转原则

在这里插入图片描述

依赖倒转原则(Dependence Inversion Principle)

基本介绍

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象(接口/抽象类)
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转(倒置)的中心思想是面向接口编程
  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定的多。在Java中,抽象指的是接口或抽象类,细节就是具体的实现类
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
/*** Created with IntelliJ IDEA.* User: Mingda* Time: 2024/2/26 11:26* File: DependecyInversion* Description: 依赖倒转原则*/
public class DependencyInversion {public static void main(String[] args) {Persion persion = new Persion();persion.receive(new Email());}
}class Email {public String getInfo() {return "email: hello!";}
}/*** 完成Persion接收消息的功能* 方式1:* 1. 简单,容易实现* 2. 如果我们获取的对象是微信,短信等,则需新增类,同时Persion类也需要添加相应的接收方法* 3. 解决思路:引入一个抽象接口IReceive,表示接收者,这样Persion类与接口发生依赖关系。Email、微信、短信等各自实现IReceive接口,符合依赖倒转原则*/
class Persion {public void receive(Email email) {System.out.println(email.getInfo());}
}
/*** Created with IntelliJ IDEA.* User: Mingda* Time: 2024/2/26 11:26* File: DependecyInversion* Description: 依赖倒转原则*/
public class DependencyInversion {public static void main(String[] args) {// 客户端无需改变Persion persion = new Persion();persion.receive(new Email());persion.receive(new WeChat());}
}// 定义一个接口
interface IReceiver {public String getInfo();
}// Email
class Email implements IReceiver {public String getInfo() {return "email: hello!";}
}// 微信
class WeChat implements IReceiver {public String getInfo() {return "wechat: hello!";}
}/*** 方式2*/
class Persion {// 对接口的依赖public void receive(IReceiver receiver) {System.out.println(receiver.getInfo());}
}

依赖关系传递的三种关系

  1. 接口传递
  2. 构造方法传递
  3. setter方式传递
/*** Created with IntelliJ IDEA.* User: Mingda* Time: 2024/2/26 15:29* File: DependencyPass* Description:*/
public class DependencyPass {public static void main(String[] args) {ChangHong tv = new ChangHong();// 方式1
//        OpenAndClose openAndClose = new OpenAndClose();
//        openAndClose.open(tv);// 方式2
//        OpenAndClose openAndClose = new OpenAndClose(tv);
//        openAndClose.open();// 方式3OpenAndClose openAndClose = new OpenAndClose();openAndClose.setTv(tv);openAndClose.open();}
} 方式1:通过接口传递实现依赖
 开关的接口
//interface IOpenAndClose {
//    public void open(ITV tv);
//}
//
 ITV接口
//interface ITV {
//    public void play();
//}
//
//class ChangHong implements ITV {
//    public void play() {
//        System.out.println("ChangHong is playing");
//    }
//}
//
 实现接口
//class OpenAndClose implements IOpenAndClose {
//    public void open(ITV tv) {
//        tv.play();
//    }
//} 方式2:通过构造方法依赖传递
//interface IOpenAndClose {
//    public void open();
//}
//
//interface ITV {
//    public void play();
//}
//
//class ChangHong implements ITV {
//    public void play() {
//        System.out.println("ChangHong is playing");
//    }
//}
//
//class OpenAndClose implements IOpenAndClose {
//    private ITV tv;
//
//    public OpenAndClose(ITV tv) {
//        this.tv = tv;
//    }
//
//    public void open() {
//        tv.play();
//    }
//}// 方式3:通过setter方法传递
interface IOpenAndClose {public void open();public void setTv(ITV tv);
}interface ITV {public void play();
}class ChangHong implements ITV {public void play() {System.out.println("ChangHong is playing");}
}class OpenAndClose implements IOpenAndClose {private ITV tv;public void setTv(ITV tv) {this.tv = tv;}public void open() {tv.play();}
}

注意事项和细节

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好
  2. 变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
  3. 继承时遵循里氏替换原则

github笔记

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ZYNQ Vivado更新硬件后SDK不更新问题解决办法

一、情况说明 软件版本 Vivado 2018.3 Vivado更新硬件导出后,按正常SDK会自动检测到hdf文件的变化跳出更新提示(如下图所示)。但是我的项目如果是复制的或者是长时间没打开的项目更新硬件配置导出后SDK无法自动更新。 二、解决办法 2.1 …

苏宁商品详情大揭秘:一键解锁API接口,电商数据尽在掌握

苏宁商品详情API接口技术深度探索 一、引言 在电商领域,获取商品详情是许多业务场景的基础需求。苏宁商品详情API接口为此提供了便捷的途径。本文将带你深入了解苏宁商品详情API接口的技术细节,帮助你更好地利用这一接口,提升业务效率。 二…

刷题日记 | 字符串扩容和增强型for循环

for(char c:s)遍历字符串 增强型for循环 C for(char c:s)遍历字符串 增强型for循环_c for (char c : s)-CSDN博客 字符串使用前要进行扩容 reserve函数 【CString类成员函数辨析】resize(),size(),capacity(),reserve()函数的解析与对比_c reserve函数-CSDN博客 a.size() 用来…

【已解决】解决Win11忘记开机密码(不用重装系统)

问题起因 因为在实验室的电脑从过年就没有用过,也不知道为什么记性这么差,就把电脑密码忘了,但是又不想用系统盘重装电脑。于是从网上整理一些文章,最后写了下面一篇解决方法 解决方法 1.首先在登录界面(输入密码那…

leetcode:46.全排列

1.什么是排列? 有顺序!! 2.树形结构: 使用used数组进行标记取过的元素,一个元素一个元素地进行取值,取完之后将used数组进行标记。 3.代码实现:(循环从i0开始,而不是…

转本考前如何调整心态

不少同学还在过年的氛围中还没走出来。 担忧自己成绩不进反退,又不知道该如何调整心态!这个时候小编就有几点小建议给到各位考生。 *心态*情绪 良好的考试心态是没有固定的心态,对不同学习情况的学生来说,良好的考试心态是不一…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子…

国创证券:60分钟底背离什么意思?

60分钟底违背指的是当股价60分钟k线图中股票走势一峰比一峰低,而macd技术目标图形上的由红柱构成的图形走势是一峰比一峰高。即股价成跌落趋势时,技术目标呈上升利好,表示跌落动能削弱,股价或许迎来回转。 K线是由一段时间内的开…

4.4 MySQL存储

目录 1、使用前提 2、使用连接数据库最初步骤 2.1 最初步骤 2.2 connect()方法中参数简单传递 3、创建数据库(创建架构)和创建表 3.1 创建数据库(创建架构) 3.2 创建表 3.2.1 基本创建 3.2.2 创建自增主键 4、Pycharm 可视化连接 MySQL 图形界面 5、插入、更新、查询…

*ctf 2019 oob

diff文件如下 diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index b027d36..ef1002f 100644 --- a/src/bootstrapper.ccb/src/bootstrapper.cc-1668,6 1668,8 void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,Builtins::kArrayProto…

信号完整性分析基本概念

“设计师可以分成两类&#xff0c;一类已经遇到了信号完整性问题&#xff0c;另一类即将遇到信号完不整性问题” 随着时钟频率的提高&#xff0c;发现并解决信号完整性问题成为产品开发的关键。因此需要精通信号完整性分析技术&#xff0c;并能采取高效设计过程以消除这些问题…

SD-WAN案例:总部(MPLS)与分支(普通宽带)的互联互通

某制造业企业面临着总部采用MPLS专线而分支机构使用普通宽带的网络互联挑战。这种情况下&#xff0c;如何降低网络成本&#xff0c;提高网络效率成为当前亟需解决的问题。本文将介绍该企业如何通过部署SD-WAN实现互联互通。 网络痛点及需求分析&#xff1a; 该企业主要痛点包括…

【Vue3】插槽使用和animate使用

插槽使用 插槽slot匿名插槽具名插槽插槽作用域简写 动态插槽transition动画组件自定义过渡class类名如何使用animate动画库组件动画生命周期appear transition- group过渡列表 插槽slot 插槽就是子组件中提供给父组件使用的一个占位符父组件可以在这个占位符智能填充任何模板代…

数字化转型导师坚鹏:省级政府数字化转型案例研究

省级政府数字化转型案例研究 课程背景&#xff1a; 很多省级政府存在以下问题&#xff1a; 不清楚省级政府数字化转型的政务服务类成功案例 不清楚省级政府数字化转型的社会管理类成功案例 不清楚省级政府数字化转型的数字机关类成功案例 不清楚省级政府数字化转型的…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础&#xff0c;它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行&#xff0c;分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…

LeetCode 0235.二叉搜索树的最近公共祖先:用搜索树性质(不遍历全部节点)

【LetMeFly】235.二叉搜索树的最近公共祖先&#xff1a;用搜索树性质&#xff08;不遍历全部节点&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/ 给定一个二叉搜索树, 找到该树中两个指定节点的最近公…

代码随想录算法刷题训练营day23

代码随想录算法刷题训练营day23&#xff1a;LeetCode(669)修剪二叉搜索树、LeetCode(108)将有序数组转换为二叉搜索树、LeetCode(538)把二叉树转化为累加树 LeetCode(669)修剪二叉搜索树 题目 代码 /*** Definition for a binary tree node.* public class TreeNode {* …

装配行业如何通过MES系统实现生产管理数字化

一、装配行业生产现状&#xff1a; 装配行业作为我国基础制造产业之一&#xff0c;在工厂数字化改造的大潮下&#xff0c;运用数字化手段提高企业的生产效率、产品良率&#xff0c;进一步塑造企业的核心竞争力&#xff0c;已成为大势所趋。 我国目前的装配企业&#xff0c;生…

项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136277231 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

数据可视化引领智慧仓储新时代

随着科技的飞速发展&#xff0c;数据可视化已然成为智慧仓储领域的璀璨明珠&#xff0c;其强大的功能和多面的作用让智慧仓储焕发出勃勃生机。让我们一同探索&#xff0c;数据可视化究竟在智慧仓储中起到了怎样的作用。下面我就以可视化从业者的角度来简单谈谈这个话题。 在这…