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

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

考虑一个电商系统,其中有一个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,一经查实,立即删除!

相关文章

MacOS安装PHP5.6的Redis扩展

更多版本下载地址:https://pecl.php.net/package/redis 安装步骤 wget http://pecl.php.net/get/redis-2.2.7.tgztar -zxvf redis-2.2.7.tgzcd redis-2.2.7phpize./configure --with-php-config/usr/local//php/5.6.40/bin/php-configmake && make instal…

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

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

前端-部署配置前端项目时,关于env.development、env.production以及nginx.conf的关系

今天要打包前端项目生产镜像部署,学习到了关于env.development、env.production以及nginx.conf的关系 env.development 首先是env.development,这里面主要放的是我们本地开发时的代理服务器(需要代理来解决跨域问题的话) env.p…

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

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

离散傅立叶变换和线性变换的关系:什么是线性空间?

离散傅立叶变换和线性变换的关系:什么是线性空间? 本篇博客是在学习线性空间知识的时候联想到的,通过分析DFT背后的数学原理,以便更好地理解什么是线性空间、什么是线性变换。 1、离散傅立叶变换(DFT)和F…

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

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

Mac[M1]安装mongodb

要在Mac(M1芯片)上安装MongoDB,可以按照以下步骤进行操作: 打开终端:你可以在“应用程序”文件夹中找到“终端”应用程序,或者使用Spotlight搜索并打开它。安装Homebrew:在终端中运行以下命令安…

帮我超越技术壁垒的“泰斗”服务--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-…

2024年测量、信号处理与深度学习国际会议(ICMSPDL 2024)

2024年测量、信号处理与深度学习国际会议(ICMSPDL 2024) 2024 International Conference on Measurement, Signal Processing, and Deep Learning ICMSPDL 2024是一个汇集行业和学术界的顶级论坛。会议将邀请国内外知名专家就信号处理、测量、深度学习方…

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

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

数据库基础面试第二弹

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

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

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

工作记录----CountDownLatch(特别好用的一个工具类)

CountDownLatch 是 Java 并发包中的一个同步工具类,它可以让一个或多个线程等待其他线程完成操作。它的核心思想是,一个线程(或多个线程)在执行某个任务时,可以通过它等待其他线程的信号,直到其他线程的任务完成才继续执行。用于实现线程间的等待和通知机制。 主要特点:…

前端常用的工具网站

前端常用的工具网站🔖 文章目录 前端常用的工具网站🔖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…

二、C#基础语法( 变量与数据类型)

C# 是一种强类型的编程语言,这意味着在声明变量时必须指定其数据类型。数据类型是用于定义变量可以持有的数据类型的系统。C# 支持多种内置数据类型,同时也支持用户自定义的数据类型。 变量 变量是用来存储数据的容器。在 C# 中,每个变量都有一个特定的数据类型,这决定了…