为什么说依赖抽象就变得更加灵活呢?举例

说依赖抽象变得更加灵活的主要原因在于它提供了更大的替换和扩展的空间。让我们通过一个简单的例子来说明:

考虑一个电商系统,其中有一个OrderProcessor类负责处理订单,它依赖于一个PaymentGateway用于处理支付。最初的设计可能如下所示:

public class OrderProcessor {private PaymentGateway paymentGateway;public OrderProcessor(PaymentGateway paymentGateway) {this.paymentGateway = paymentGateway;}public void processOrder(Order order) {// 处理订单逻辑// ...// 处理支付paymentGateway.processPayment(order.getTotalAmount());}
}public class PaymentGateway {public void processPayment(double amount) {// 处理支付逻辑}
}

在这个设计中,OrderProcessor直接依赖于具体的PaymentGateway实现。这样的设计在初期可能是合理的,但如果未来系统需要支持多种支付方式,这个设计就会显得不够灵活。如果有新的支付方式加入,就需要修改OrderProcessor的代码,违反了开闭原则。

通过应用依赖倒置原则,我们可以使用抽象来提高灵活性。首先,我们定义一个PaymentProcessor接口,表示所有支付处理器的抽象:

public interface PaymentProcessor {void processPayment(double amount);
}

然后,我们修改OrderProcessor,使其依赖于抽象的PaymentProcessor

public class OrderProcessor {private PaymentProcessor paymentProcessor;public OrderProcessor(PaymentProcessor paymentProcessor) {this.paymentProcessor = paymentProcessor;}public void processOrder(Order order) {// 处理订单逻辑// ...// 处理支付paymentProcessor.processPayment(order.getTotalAmount());}
}

现在,OrderProcessor不再直接依赖于具体的PaymentGateway,而是依赖于抽象的PaymentProcessor接口。这使得我们可以轻松地引入新的支付处理器,而不需要修改OrderProcessor的代码。例如,我们可以添加一个新的AlipayProcessor实现:

public class AlipayProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {// Alipay 支付逻辑}
}

通过这样的设计,我们可以根据需要轻松替换支付处理器,而OrderProcessor的代码保持不变。这样的设计提供了更大的灵活性和可扩展性,使得系统更容易应对未来的变化。

其实就是保持原来的代码不变的情况下来,处理新的业务逻辑需求。

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

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

相关文章

LabVIEW进行激光斑点图像处理与分析

LabVIEW进行激光斑点图像处理与分析 近年来,激光技术的应用日益繁荣。激光光斑的质量评估和分析技术决定了应用效果,对机器视觉、武器装备、光学测量和医疗设备产生深远影响。就具体用途和技术而言,激光光斑的采集和处理至关重要。即插即用的…

渗透测试 | php的webshell绕过方法总结

目录 1.php的异或运算 2.通过获取注释去绕过 3.利用字符的运算符​​​​​​​ 4.通过end函数代替[] 5.通过常量去绕过 6.字符串拼接双美元符 7.通过函数定义绕过 8.通过类定义,然后传参分割 9.多传参方式绕过​​​​​​​ 10.通过get_defined_function…

使用Maven Archetype插件制作项目脚手架(一)

Archetype是一个Maven项目模板工具包。通过Archetype我们可以快速搭建Maven项目。比如我们在ide里面创建项目时,可以选择很多maven内置的Archetype,我们最常用的可能是maven-archetype-quickstart 当然maven提供了能力,让我们自定义项目结构&…

帮我超越技术壁垒的“泰斗”服务--Amazon ElastiCache

前言 作为开发者,外加上云服务的使用者,对于借助云服务来提升日常开发中的效率是一个非常关键且重要的事情。在日常实际开发中,关于缓存服务领域想必作为开发者应该都不陌生,比如常用到的 Redis 就是缓存服务之一。对于互联网领域…

使用ffmpeg实现视频旋转并保持清晰度不变

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i source.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-…

Gin框架之使用 go-ini 加载.ini 配置文件

首先,联想一个问题,我们在部署服务时,通常为了方便,对于需要迭代更新的代码进行修改,但是比对shell,可以搞一个变量将需要修改的,以及修改起来变动处多的,写在变量内,到时候如果需要变更,可以直接变更变量即可; 那么,golang有没有什么方式可以将需要变的东西保存起…

数据库基础面试第二弹

1. 乐观锁和悲观锁的理解及使用 乐观锁和悲观锁是在并发编程中使用的两种并发控制机制,用于解决多线程或多进程环境下的数据一致性问题。 1. 悲观锁(Pessimistic Locking):   悲观锁的思想是假设并发访问会导致冲突&#xff0…

贪吃蛇小游戏的代码实现之知识点铺垫篇

今天给大家介绍一个很经典的小游戏,它和扫雷在经典小游戏这方面可以说是旗鼓相当,它的名字就是贪吃蛇。贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。该游戏具体玩法是:用游戏把子上下左右控…

前端常用的工具网站

前端常用的工具网站🔖 文章目录 前端常用的工具网站🔖1. 图片在线压缩2. iconfont--矢量图标3. JSON在线格式化4. EMOJIALL--表情符号5. removebg--去除图片背景6. FREE API--免费API接口7. Lorem picsum --随机图片8.UU在线工具 -- 聚合工具 1. 图片在线…

生活服务网站搭建的作用是什么

如今生活服务商家面临获客、信息展示及多渠道传播信息的难题,传统线下形式如街道发传单、人口相传等形式非常低效,容易投入成本得不到回报,且数据难以统计。 互联网时代,线上渠道平台汇聚亿级流量,生活服务商家也需要一…

C++ std::string使用效率优化

字符串操作是任何一个C开发程序无法绕过的点,很多时候针对字符串的操作需要进行优化,从而达到更优的使用效率和内存利用率。一般会采用标准的std::string替代C字符串,一方面是std::string为一个成熟的类对象,其成员操作基本能满足…

什么是“私域流量”?

公域流量,字面意思就是人人都可以用的流量,但要付出一定成本,而且不一定可持续。 具体到实际对象,则是线下流量以及BAT等几个互联网流量大户,尤其是后者,比如微信、QQ、天猫、淘宝、百度、抖音、快手、微博…

vue-awesome-swiper轮播组件

安装版本&#xff1a;"swiper": "^6.0.0", 安装版本&#xff1a;"vue-awesome-swiper": "^4.1.1", <div class"swiper_conter"><swiper class"swiper" :options"swiperOption" ref"mySw…

算法leetcode|94. 二叉树的中序遍历(多语言实现)

文章目录 94. 二叉树的中序遍历&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 94. 二叉树的中序遍历&#xff1a; …

Spring高手之路-Spring AOP

目录 什么是AOP Spring AOP有如下概念 补充&#xff1a; AOP是如何实现的 Spring AOP 是通过代理模式实现的。 Spring AOP默认使用标准的JDK动态代理进行AOP代理。 什么是AOP AOP(Aspect-Oriented Programming)&#xff0c;即面向切面编程&#xff0c;用人话说就是把公共的…

开发人工智能 需要什么工具

人工智能&#xff08;Artificial Intelligence, AI&#xff09;是指利用计算机模拟、扩展和延伸人类智能的理论、方法、技术和应用系统的一门学科。人工智能研究的目标是使计算机能够像人类一样具有智能&#xff0c;能够感知和理解环境、学习和推理、决策和规划&#xff0c;具备…

jar 运行清单文件MANIFEST.MF生成定义Main-Class Premain-Class IDEA maven-assembly-plugin

可运行jar文件中的启动清单文件 META-INF/MANIFEST.MF 内容自定义生成 清单文件中的 Main-Class: Premain-Class: Can-Retransform-Classes: 在maven-assembly-plugin插件中的生成配置如下, 注意命名 <archive> <manifest> <mainClass>c…

Dockerfile构建镜像

Dockerfile构建镜像 Dockerfile 是一个文本格式的配置文件&#xff0c; 用户可以使用 Dockerfile 来快速创建自定义的镜像&#xff0c;另外&#xff0c;使 用Dockerfile去构建镜像好比使用pom去构建maven项目一样&#xff0c;有异曲同工之妙 基本结构 Dockerfile 由一行行…

Intel® SGX Instruction References(五)

文章目录 前言一、Intel SGX Instruction Syntax and Operation1.1 ENCLS Register Usage Summary1.2 ENCLU Register Usage Summary1.3 ENCLV Register Usage Summary1.4 Information and Error Codes1.5 Internal CREGs1.6 Concurrent Operation Restrictions 二、Intel SGX …

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 王炸产品 Amazon Q,你的 AI 助手

意料之中 2023年9月25日&#xff0c;亚马逊宣布与 Anthropic 正式展开战略合作&#xff0c;结合双方在更安全的生成式 AI 领域的先进技术和专业知识&#xff0c;加速 Anthropic 未来基础模型的开发&#xff0c;并将其广泛提供给亚马逊云科技的客户使用。 亚马逊云科技开发者社…