Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)

文章目录

    • 3.3 依赖倒转原则(DIP)
      • 3.3.1概述
      • 3.3.2 案例

3.3 依赖倒转原则(DIP)

依赖倒转原则:Dependency Inversion Principle,DIP

3.3.1概述

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

3.3.2 案例

下面看一个例子来理解依赖倒转原则

【例】组装电脑

现要组装一台电脑,需要配件cpu,硬盘,内存条。只有这些配置都有了,计算机才能正常的运行。选择cpu有很多选择,如Intel,AMD等,硬盘可以选择希捷,西数等,内存条可以选择金士顿,海盗船等。

在这里插入图片描述

public class InterCpu {public void runCpu(){System.out.println("Inter的cpu正在运行...");}
}
====================================================public class KingstonMemory {public void saveMemory(){System.out.println("使用金士顿作为内存条...");}
}
====================================================public class XiJieHardDisk {public void saveDisk(String data){System.out.println("从硬盘获取的数据是:"+data);}public String  getData(){System.out.println("获取硬盘数据操作...");return "获取硬盘数据完成。";}
}
====================================================public class Computer {private XiJieHardDisk hardDisk;//硬盘private InterCpu cpu;// cpuprivate KingstonMemory memory;//内存public Computer() {}public Computer(XiJieHardDisk hardDisk, InterCpu cpu, KingstonMemory memory) {this.hardDisk = hardDisk;this.cpu = cpu;this.memory = memory;}public XiJieHardDisk getHardDisk() {return hardDisk;}public void setHardDisk(XiJieHardDisk hardDisk) {this.hardDisk = hardDisk;}public InterCpu getCpu() {return cpu;}public void setCpu(InterCpu cpu) {this.cpu = cpu;}public KingstonMemory getMemory() {return memory;}public void setMemory(KingstonMemory memory) {this.memory = memory;}public void runComputer(){System.out.println("计算机正在工作...");cpu.runCpu();memory.saveMemory();hardDisk.saveDisk("你好Java。");String data = hardDisk.getData();System.out.println(data);}
}
=========================================================//测试类public class ComputerTest {public static void main(String[] args) {// 创建计算机组件内存、硬盘、cpuKingstonMemory k = new KingstonMemory();//表示内存InterCpu  i = new InterCpu();// 表示 cpuXiJieHardDisk x = new XiJieHardDisk();// 表示硬盘// 创建计算机对象,并组装(即,传入组件参数)Computer computer = new Computer(x,i,k);// 运行计算机computer.runComputer();}
}

上面代码可以看到已经组装了一台电脑,但是似乎组装的电脑的cpu只能是Intel的,内存条只能是金士顿的,硬盘只能是希捷的,这对用户肯定是不友好的,用户有了机箱肯定是想按照自己的喜好,选择自己喜欢的配件。如果想换成不是Intel的cpu需要修改Computer类,这就违背了开闭原则。

根据依赖倒转原则进行改进:

在这里插入图片描述

// Cpu接口
public interface Cpu {public abstract void runCpu();
}
===========================================================// 硬盘接口
public interface HardDisk {public abstract void saveDate(String date);public abstract String getDate();
}
==========================================================// 内存接口
public interface Memory {public abstract void saveMemory();
}
==========================================================//IntelCpu类实现Cpu接口public class IntelCpu implements Cpu{@Overridepublic void runCpu() {System.out.println("InterCpu正在运行...");}
}
==========================================================// 新增Amd类型的cpu 
public class AmdCpu implements Cpu{@Overridepublic void runCpu() {System.out.println("AMD Cpu正在运行...");}
}
==========================================================// KingstonMemory类实现Memory接口
public class KingstonMemory implements Memory{@Overridepublic void saveMemory() {System.out.println("使用金士顿作为内存条...");}
}
==========================================================// XiJieHardDisk类实现HardDisk接口
public class XiJieHardDisk implements HardDisk{@Overridepublic void saveDate(String date) {System.out.println("从硬盘获取的数据是:"+date);}@Overridepublic String getDate() {System.out.println("获取硬盘数据操作...");return "获取硬盘数据完成。";}
}
============================================================//聚合各种组件public class Computer {private HardDisk hardDisk;private Cpu cpu;private Memory memory;public Computer() {}public Computer(HardDisk hardDisk, Cpu cpu, Memory memory) {this.hardDisk = hardDisk;this.cpu = cpu;this.memory = memory;}public HardDisk getHardDisk() {return hardDisk;}public void setHardDisk(HardDisk hardDisk) {this.hardDisk = hardDisk;}public Cpu getCpu() { return cpu;}public void setCpu(Cpu cpu) { this.cpu = cpu;}public Memory getMemory() { return memory;}public void setMemory(Memory memory) {this.memory = memory;}//运行计算机方法public void runComputer(){System.out.println("计算机正在工作...");cpu.runCpu();memory.saveMemory();hardDisk.saveDate("你好Java。");String data = hardDisk.getDate();System.out.println(data);}
}
=======================================================//测试类public class ComputerTest {public static void main(String[] args) {// 创建计算机的组件:内存、cpu、硬盘// Cpu cpu = new IntelCpu();Cpu cpu = new AmdCpu();HardDisk hardDisk = new XiJieHardDisk();Memory memory = new KingstonMemory();// 创建计算机Computer computer = new Computer(hardDisk,cpu,memory);// 运行计算机computer.runComputer();}
}

上述代码根据依赖倒转原则改进后扩展性比较好,如想换AMD类型的Cpu,只需子新增一个AmdCpu类去实现Cpu接口,重写Cpu里的抽象方法,再在测试类中去用Cpu接口去接AmdCpu的对象即可,这样就不用修改Computer类里面的代码了。

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

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

相关文章

PXE服务

一.PXE服务的功能介绍 1.无盘启动:PXE允许计算机在没有本地存储设备的情况下启动操作系统。这对于构建无盘工作站非常有用,因为计算机可以直接从网络加载操作系统和其他应用程序1。 2.远程安装操作系统:PXE技术可以用于远程安装操作系统&…

HTML讲解(二)head部分

目录 1. 2.的使用 2.1 charset 2.2 name 2.2.1 describe关键字 2.2.2 keywords关键字 2.2.3 author关键字 2.2.4 http-equiv 小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化&#x…

VSCode C++(Code Runner)+ OpenSSL开发环境搭建

本章教程,主要介绍在VSCode中配置OpenSSL环境。 操作系统:wsl+ubuntu22.04 一、安装必备组件 1、安装g++ sudo apt install g++ 2、安装 OpenSSL sudo apt-get install libssl-dev 3、安装Code Runner插件 这个在vscode的插件市场可以找到,极力推荐使用,安装插件,可以…

nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink

完整错误信息 npm error Error: EPERM: operation not permitted, symlink npm warn cleanup Failed to remove some directories [ npm warn cleanup [ npm warn cleanup C:\\Users\\kingchuxing\\Documents\\IPFS\\orbit-db-set-master\\node_modules\\ipfs-cli, npm…

如何在 Ubuntu 系统上部署 Laravel 项目 ?

到目前为止,Laravel 是 PHP 开发人员构建 api 和 web 应用程序的首选。如果你是新手的话,将 Laravel 应用程序部署到线上服务器上可能有点棘手。 在本指南中,我们将向您展示在 Ubuntu 系统中部署 Laravel 应用程序的全过程。 Step 1: Updat…

c++中的二叉搜索树

目录 ​编辑 一概念: 二性能分析: 三实现步骤: 31插入: 32删除: 33查找: 四应用(key与key_value): 41key模型: 42key_value模型: 一概念: 静图展示…

Linux(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑),然后C盘、D盘。 Linux系统的根目录是/,我们可以使用cd /进入根目录,然后使…

20240919 - 【PYTHON】辞职信

import tkinter as tk # 导入 tkinter 模块,并简写为 tk from tkinter import messagebox # 从 tkinter 导入 messagebox 子模块,用于显示消息框 from random import random # 从 random 模块导入 random 函数,用于生成随机数# 创建窗口对…

一本还没发布的书,能在Github上拿25.6k⭐️,熬夜也要读完的书

重磅!从零构建大语言模型教程开源! 自从ChatGPT发布以来,大型语言模型(LLM)大放异彩。 如今市面上关于大模型的书籍和教程可谓琳琅满目,但基本上都只是从原理和参数调优上讲解的,没有一本系统性…

借老系统重构我准备写个OpenAPI3.1版的API管理工具(附录屏演示)

前段时间一直在忙公司老系统重构的方案设计,其中最大的重构点就是前后端分离。为了加快前后端协同开发和对接的工作效率,我决定写一个公司内部使用的OpenAPI3.1版的API管理工具。 文章目录 有现成的工具为啥不用现有成熟方案初步成果展示录屏演示下一步计…

手语识别系统源码分享

手语识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

计算机专业的就业方向

计算机专业的就业方向 亲爱的新生们,欢迎你们踏上计算机科学的旅程!作为一名计算机专业的学生,你们即将进入一个充满无限可能的领域。今天,我将为大家介绍计算机专业的一些主要就业方向,帮助你们了解未来的职业选择。…

Java面试篇基础部分-Java内部类介绍

首先需要了解什么是内部类,内部类就是定义在类的内部的类称为内部类,内部类可以根据不同的定义方式分为静态内部类、成员内部类、局部内部类和匿名内部类。 静态内部类 定义在类体内部的通过static关键字修饰的类,被称为静态内部类。静态内部类可以访问外部类的静态变量和…

深度学习对抗海洋赤潮危机!浙大GIS实验室提出ChloroFormer模型,可提前预警海洋藻类爆发

2014 年 8 月,美国俄亥俄州托莱多市超 50 万名居民突然收到市政府的一则紧急通知——不得擅自饮用自来水! 水是人类生存的基本供给,此通告关系重大,发出后也引起了不小的恐慌。究其原因,其实是美国伊利湖爆发了大规模…

OpenCV运动分析和目标跟踪(4)创建汉宁窗函数createHanningWindow()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 此函数计算二维的汉宁窗系数。 createHanningWindow是OpenCV中的一个函数,用于创建汉宁窗(Hann window)。汉宁…

Give azure openai an encyclopedia of information

题意:给 Azure OpenAI 提供一部百科全书式的信息 问题背景: I am currently dabbling in the Azure OpenAI service. I want to take the default model and knowledge base and now add on to it my own unique information. So, for example, for mak…

Vert.x HttpClient调用后端服务时使用Idle Timeout和KeepAlive Timeout的行为分析

其实网上有大量讨论HTTP长连接的文章,而且Idle Timeout和KeepAlive Timeout都是HTTP协议上的事情,跟Vert.x本身没有太大关系,只不过最近在项目上遇到了一些问题,用到了Vert.x的HttpClient,就干脆总结一下,留…

react学习笔记一:react介绍

将view规划成一个个的组件,是一个响应式的声明式的设计。 虚拟dom,减少dom操作。vue的虚拟dom是在react的基础上拓展来的。 单向数据流:是一种数据流动的模式。数据流的方向是有上到下的,在react中主要是从父组件流向子组件。 …

C语言进阶四:(指针和数组笔试题解析1)

一维数组: sizeof是计算内存大小的,strlen是计算字符串的长度。 int main() {//一维数组int a[] {1,2,3,4};printf("%d\n", sizeof(a));printf("%d\n", sizeof(a 0));printf("%d\n", sizeof(*a));printf("%d\n&q…

GitLab邮箱发送邮件:如何实现自动化发信?

gitlab邮箱发送邮件设置教程?Gitlab邮箱配置和使用? GitLab不仅提供了代码版本控制、持续集成/持续部署等功能,还支持通过其内置的邮件功能实现自动化邮件发送。AokSend将深入探讨如何在GitLab中配置和使用邮箱发送邮件功能。 GitLab邮箱发…