超详细超实用!!!AI编程之cursor编写设计模式里氏替换原则实例(五)

云风网
云风笔记
云风知识库

一、设计模式里氏替换原则定义

里氏替换原则是面向对象设计的基本原则之一。 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏替换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。

二 、原则作用

  1. 里氏替换原则是实现开闭原则的重要方式之一。
  2. 它克服了继承中重写父类造成的可复用性变差的缺点。
  3. 它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
  4. 加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。

里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能

也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

根据上述理解,对里氏替换原则的定义可以总结如下:

  1. 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
  2. 子类中可以增加自己特有的方法
  3. 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
  4. 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

三、原则实现实例

1、新建main.java空白文件,cursor输入指令

在这里插入图片描述
在这里插入图片描述

2、自动生成代码以及文件
2.1、Main.java代码如下:
public class Main {public static void main(String[] args) {PaymentProcessor creditCardProcessor = new CreditCardProcessor("1234-5678-9012-3456");OrderProcessor creditCardOrder = new OrderProcessor(creditCardProcessor);System.out.println("Processing credit card order:");creditCardOrder.processOrder(100.00);creditCardOrder.refundOrder(100.00);System.out.println("\n----------------------------\n");PaymentProcessor payPalProcessor = new PayPalProcessor("example@email.com");OrderProcessor payPalOrder = new OrderProcessor(payPalProcessor);System.out.println("Processing PayPal order:");payPalOrder.processOrder(50.00);payPalOrder.refundOrder(50.00);}
}
2.2、PaymentProcessor.java代码如下:

PaymentProcessor 接口定义了所有支付处理器的通用行为。

public interface PaymentProcessor {boolean processPayment(double amount);void refund(double amount);String getPaymentMethod();
}
2.3、CreditCardProcessor.java代码如下:
public class CreditCardProcessor implements PaymentProcessor {private String cardNumber;public CreditCardProcessor(String cardNumber) {this.cardNumber = cardNumber;}@Overridepublic boolean processPayment(double amount) {System.out.println("Processing credit card payment of $" + amount);// 实际实现中,这里会有信用卡支付的逻辑return true;}@Overridepublic void refund(double amount) {System.out.println("Refunding $" + amount + " to credit card");// 实际实现中,这里会有退款到信用卡的逻辑}@Overridepublic String getPaymentMethod() {return "Credit Card";}
}
2.4、PayPalProcessor.java代码如下:
public class PayPalProcessor implements PaymentProcessor {private String email;public PayPalProcessor(String email) {this.email = email;}@Overridepublic boolean processPayment(double amount) {System.out.println("Processing PayPal payment of $" + amount);// 实际实现中,这里会有PayPal支付的逻辑return true;}@Overridepublic void refund(double amount) {System.out.println("Refunding $" + amount + " to PayPal account");// 实际实现中,这里会有退款到PayPal账户的逻辑}@Overridepublic String getPaymentMethod() {return "PayPal";}
}
2.5、OrderProcessor 类代码如下:

OrderProcessor 类接受任何 PaymentProcessor 对象,并能正确处理它们的行为。

public class OrderProcessor {private PaymentProcessor paymentProcessor;public OrderProcessor(PaymentProcessor paymentProcessor) {this.paymentProcessor = paymentProcessor;}public boolean processOrder(double amount) {boolean paymentSuccess = paymentProcessor.processPayment(amount);if (paymentSuccess) {System.out.println("Order processed successfully using " + paymentProcessor.getPaymentMethod());return true;} else {System.out.println("Order processing failed");return false;}}public void refundOrder(double amount) {paymentProcessor.refund(amount);System.out.println("Order refunded using " + paymentProcessor.getPaymentMethod());}
}
3、运行主程序输出

在 Main 类中,我们可以用 CreditCardProcessor 或 PayPalProcessor 对象替换 PaymentProcessor 类型的变量,而不会影响程序的正确性。

在这里插入图片描述

这个例子展示了如何在不同类型的支付处理器之间进行替换,而不影响使用这些处理器的代码。这种设计允许我们轻松地添加新的支付方式,而不需要修改现有的 OrderProcessor 类。

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

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

相关文章

企业如何通过加密软件保护敏感信息和客户数据?

1、数据加密:采用先进的加密算法,如AES-256,对敏感信息和客户数据进行加密处理。这样,即使数据被非法获取,未授权人员也无法解密和访问数据内容。 访问控制:设置严格的访问控制策略,确保只有授…

电网绝缘子损坏识别检测数据集

电网绝缘子损坏识别检测数据集 yolo数据集 1600张 电网绝缘子损坏识别检测数据集(Power Grid Insulator Damage Detection Dataset) 数据集概述 该数据集专为电网绝缘子损坏的自动检测任务设计,旨在帮助电力部门和相关研究机构通过图像识别技…

代码随想录算法day39 | 动态规划算法part12 | 115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离

115.不同的子序列 相对于 392.判断子序列,本题有难度了,感受一下本题和 392.判断子序列 的区别。 力扣题目链接(opens new window) 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff…

电路 - 笔记2

1 555 芯片 2 类比 - pU*I 与 Fm*a 是不是可以与牛顿定律类比 - Fm*a 人的力量(F)有限。 当推大箱子(m)时,加速度(a)就不会很大 当推小箱子(m)时,加速度…

十大开放式耳机排名?强烈推荐这五大高性能款式!

目前市场上的开放式蓝牙耳机种类繁多,如何挑选适合自己的开放式蓝牙耳机?作为一名数码评测员,从去年在现在,也体验了许多款开放式蓝牙耳机,结合我的体验和产品配置参数,为大家整理了一份开放式耳机排行榜&a…

PostgreSQL 一张表多个字段关联另一张表

event_catalog 表 event 表 sql SELECT event.event_uuid, event.event_case_id, event.event_status, event.event_catalog_1, event.event_catalog_2, event.event_catalog_3, event.event_title, event.event_content, event.event_source, event.event_purpose, event.eve…

Hi3516CV610-20S 芯片及开发板

总体介绍 Hi3516CV610 是一颗应用在安防市场的 IPC 处理器内核 SoC。在开放操作系统、新一代视频编解码标 准、网络安全和隐私保护、人工智能方面引领行业发展,主要面向室内外场景下的枪机、球机、半球机、海 螺机、枪球一体机、双目长短焦机等产品形态,…

全球视角下的知识产权管理

跨国企业作为全球经济的重要参与者,其知识产权的管理不仅关乎企业自身利益,更影响到其在全球市场的布局与竞争力。然而,跨国企业在进行全球知识产权管理时,往往面临诸多挑战。在全球知识产权管理的过程中,专业管理系统…

【Linux】安装配置nginx

文章目录 一、替换镜像源1.对系统本身的yum源进行备份2.下载阿里云 CentOS 7 镜像源配置文件3.删除所有的自带的源,只保留阿里的,和备份源4.清除旧的 YUM 缓存5.创建新的 YUM 缓存 二、配置环境1.安装依赖2.创建nginx安装目录3.下载nginx4.安装nginx5.查…

Electron 更换窗口图标、exe执行文件图标

首先在项目根目录下准备好图标: 配置窗口图标: 配置打包后 exe执行文件 的图标: 效果展示:

动物关键点数据集-yolov8 pose动物关键点识别-动物姿态估计-keypoints(代码+数据集)

跨域适应于动物姿态估计 概览 本文介绍了一个专门用于动物姿态估计的数据集,该数据集包含了五个不同种类的动物:狗、猫、牛、马和羊。整个数据集中共包含超过6000个实例,分布在4000多张图像上。此外,数据集还为另外七种动物提供…

《十年国庆游,洞察中国旅游新趋势》

作者:侯炯 一、十年国庆旅游数据总览 过去十年,中国国庆旅游市场呈现出丰富的变化和强劲的发展态势。从接待游客人次来看,2014 年接待国内游客 4.75 亿人次,到 2019 年已增长至 7.82 亿人次,2023 年国内旅游出游人数更…

K8s安装部署(v1.28)--超详细(cri-docker作为运行时)

1、准备环境 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 2、系统配置(所有节点) 重要:首先…

关于ShuffleNetV1中的channel shuffle操作【代码分析】

1. 官方给出的代码 旷视科技在自己的开源GitHub上给出的channel shuffle相关代码如下图所示: 分析上图中的代码,旷视科技将channel shuffle这个操作视为一个函数,函数传入的参数是输入张量x,x的shape为(batchsize, num_ch…

[ComfyUI]Flux:完美平衡!更适合F1反推模型!30秒速率1G低显存CLIP和T5双通道提示反推和标注皆可用

大家好我是安琪!!! 在数字艺术领域,AI绘画技术已经逐渐成为艺术创作的新趋势。现在,ComfyUI的Flux功能结合F1反推模型,为用户提供了完美的平衡,让你在创作中更加得心应手。 Florence2PromptGen…

国庆出行新宠:南卡Pro5骨传导耳机,让旅途不再孤单

国庆长假即将来临,对于热爱旅行和户外运动的朋友们来说,一款适合旅行使用的耳机无疑是提升旅途体验的神器。今天,我要向大家推荐一款特别适合国庆出行的耳机——南卡Runner Pro5骨传导耳机。作为一名热爱旅游的体验者,我强烈推荐南…

docker:docker-compose容器编排

docker-compose容器编排 安装docker-compose 下载链接:https://github.com/docker/compose/releases/下载这个版本 [rootc1-10-66 ~]# ls anaconda-ks.cfg docker-compose-linux-x86_64_2 gpu-burn## 改个名字 [rootc1-10-66 ~]# mv docker-compose-linux-x86…

C++标准库类——string类

引言 在c中,string类的引用极大地简化了字符串的操作和管理,相比 C 风格字符串(char*或cahr[]),std::string 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧! 1.string 的构造…

blender设置背景图怎么添加?blender云渲染选择

Blender是一款功能强大的3D建模软件,它以流畅的操作体验和直观的用户界面而闻名。使用Blender,你可以轻松地为你的3D模型添加背景图片。 以下是具体的操作步骤: 1、启动Blender:首先,打开Blender软件。访问添加菜单&a…

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理

文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…