大话设计模式-里氏代换原则

news2024/11/16 7:36:17

里氏代换原则(Liskov Substitution Principle,LSP)

概念

里氏代换原则是面向对象设计的基本原则之一,由美国计算机科学家芭芭拉·利斯科夫(Barbara Liskov)提出。这个原则定义了子类型之间的关系,确保在软件中,我们可以将父类对象替换为子类对象,而不会影响程序的正确性。它在原文中的定义是这样的:如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

简单来说,就是子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能 P2 外,还要保证通过重写父类的方法完成原有功能 P1 时,子类的方法行为要和父类的一致。

而在Java中,我们通常通过继承来创建子类。根据里氏代换原则,我们需要确保子类的行为和父类的行为一致。这意味着:

  1. 子类可以增加新的方法,但是不能覆盖父类的方法改变原有的行为。
  2. 子类可以覆盖父类的方法改进原有的行为,但是结果应该和父类的结果一致。

优缺点

遵循LSP的优点:

  1. 增强可扩展性:如果子类能够替换父类而不改变程序的行为,那么我们可以在不修改现有代码的情况下,通过添加新的子类来扩展系统的功能。
  2. 提高代码的可读性和可维护性:遵循LSP可以使代码更容易理解和维护。因为如果子类和父类的行为一致,那么我们就可以理解子类的行为,而不需要查看子类的实现。
  3. 提高代码的复用性:如果子类可以替换父类,那么我们可以在不同的上下文中复用父类和子类,而不需要担心它们的行为不一致。

违反LSP的坏处:

  1. 破坏封装性:如果子类改变了父类的行为,那么使用父类的代码可能会因为子类的行为不一致而出错。这就破坏了封装性,使得代码的维护变得困难。
  2. 增加代码的复杂性:如果子类和父类的行为不一致,那么我们在理解和使用这些类时,就需要考虑它们的差异,这会增加代码的复杂性。
  3. 降低代码的可扩展性:如果子类改变了父类的行为,那么我们在扩展系统功能时,就需要考虑这些行为的差异,这会降低代码的可扩展性。

例子

假设我们有一个父类Bird和一个子类Penguin

class Bird {
    void fly() {
        System.out.println("I can fly");
    }
}

class Penguin extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("Penguins can't fly");
    }
}

在这个例子中,PenguinBird的子类,但是它覆盖了fly方法并抛出了异常,因为企鹅不能飞。这违反了里氏代换原则,因为我们不能将Bird对象替换为Penguin对象而不改变程序的行为。
通常来讲,里氏代换原则和依赖倒置原则二者相辅相成,依赖倒置原则也叫依赖倒转原则,在我们后续的文章中有详细介绍。
总的来说,遵循里氏代换原则可以帮助我们设计出更健壮、可维护和可扩展的系统。而违反这个原则可能会导致代码的复杂性增加,维护和扩展变得困难。
在这里插入图片描述

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

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

相关文章

MySQL之binlog归档日志

binlog(二进制归档日志) binlog 二进制日志记录保存所有执行过的修改操作语句,不保存查询操作。如果 MySQL 服务意外停止,可通过二进制日志文件排查,用户操作或表结构操作,从而来恢复数据库数据。启动 bin…

[BJDCTF 2020]encode

脱壳 rc4 自定义base64 异或

Make/Makefile详解

文章目录 make/MakefilemakeMakefile时间 make/Makefile Linux项目自动化构建工具。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能。makefile带来的好处就…

神经网络中的神经元和激活函数介绍

文章目录 1、什么是人工神经网络 2、什么是神经元 3、什么是激活函数 线性激活函数 Sigmoid激活函数 双曲正切激活函数 修正线性单元(ReLU)激活函数 Leaky ReLU激活函数 Softmax激活函数 1、什么是人工神经网络 神经网络能够利用多层神经元学习复杂的模…

回顾发展史,WEB组态终于可以搭建业务系统了!

一、WEB组态融合了传统工业组态和现代数据大屏 组态软件在工业控制领域有着二三十年的历史,比较知名的国内有组态王、国外有MCGS/WinCC等,用来搭建上位机监控画面,通常配合PLC使用,通过配置的方式,不需要编码&#xf…

线性表的链式存储(双向循环链表)

文章目录 前言一、双向循环链表是什么?二、双向循环链表的意义三、双向循环链表的操作实现总结 前言 T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结…

micro-app的css样式隔离

手写微前端micro-app-CSS隔离 子应用的CSS可能会对基座应用或者其他子应用产生的影响 首先现在我们把react页面放入到vue2的页面大家也能看到一些问题了,在react中的index.css中对body的一些css样式,已经影响了基座应用的css。 为了看的更明显&#x…

【Linux】git

大家好,我是苏貝,本篇博客带大家了解Linux的编译器-gcc/g,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

STL::string简单介绍

目录 1、什么是STL STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器 推荐文档(必须学会看文档) 2、string常用接口 a、初始化 1、什么是STL 标准模板库 STL(Standard Template Library),主要是数据结构…

【C++程序员的自我修炼】初识模板

云收天彩色 木叶落秋声 目录 函数模板 函数模板的实现 函数模板的实例化 模板参数的匹配原则 参数模板推不出来的情况 类模板 类模板的定义格式 类模板的实例化 契子 ✨ 我们在学 C语言 的时候应该都写过交换两个数的函数 swap 吧 当时我们只是写了 int 类型,那…

sherpa + ncnn 离线语音识别

目录结构 前言音视频格式转为wavsherpa-ncnn编译LinuxWindowswindows编译中遇到的问题问题“nmake -? failed with: no such file or directory”编译失败原因 成功编译截图 可执行程序说明模型下载语言识别测试LinuxWindows 参考文献 前言 小编需要实现离线音视频语言部分识…

#STM32F407VET6(天空星)标准库和HAL驱动ILI9341

一、驱动方式:软件SPI,屏幕像素320*240 二、标准库含触摸,HAL库不含触摸 三、立创参考的文档 【立创天空星ST32F407VET6】模块移植手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/MFNpw4STVi5ImikkcH1clWrlnqb 四、引脚分…

ElasticSearch中使用向量和关键词联合检索

注:案例测试数据及其索引构建详见:ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)-CSDN博客 中的第三部分。 假设任务场景为:用“新疆”向量检索相关的数据,同时需要匹配关键词“巴州”。 首先获取…

C#到底属于编译型语言还是解释型语言?

C#是一种编译型语言,也称为静态类型语言,这意味着C#代码在运行之前需要经过编译器的编译处理,并生成一个可执行的本地代码文件(通常是.exe或.dll文件)。相反,解释型语言将代码转换为低级代码后直接执行&…

【结构型模式】装饰器模式

​一、装饰器模式概述 装饰器模式(装饰者模式)定义:装饰器模式动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性地替代方案。(对象结构型模型)通俗点来说:动态的给一个对象增…

12.事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template><button click"addCount">Add</button><p>Count is: {{ count }}</p> </template> <script> export default {data() {return {count:0…

13.Hexo Plugins插件及将网站上传到互联网

Plugins 有些想要实现的操作Hexo实现不了&#xff0c;这时就可以使用插件 插件一般都是可以下载的代码片段&#xff0c;可以附加到Hexo上 添加了一些功能或一些额外的东西 Plugins | Hexo 在官方页面&#xff0c;有471个插件&#xff0c;并附加了一些描述 点击一个插件时&…

【研发管理】产品经理知识体系-文化、团队与领导力

导读&#xff1a;文化、团队与领导力是产品经理知识体系中的重要组成部分。产品经理需要深入理解并应用这些要素&#xff0c;以推动产品的成功开发和运营。通过塑造积极的文化氛围、建立高效的团队和发挥领导力&#xff0c;产品经理能够为公司创造更大的价值。 目录 概述 1、…

(1)认识人工智能

第一章 认识人工智能 引言 本人目前大三&#xff0c;双非一本的人工智能专业&#xff0c;代码能力不算太差&#xff0c;做过项目&#xff0c;也打了比赛&#xff0c;获了奖&#xff0c;但是走技术路线总会有否定自己的感觉&#xff0c;可能是感觉自己的才能没有在搞技术方面实…

#QT获取ONENET云平台数据(草稿)

1.基本目标 &#xff08;1&#xff09;查询ONENT云平台的数据 &#xff08;2&#xff09;查询网络时间 &#xff08;3&#xff09;网络音乐拉取&#xff08;作为背景音乐&#xff09;&#xff0c;音量可调 2.制作UI界面 &#xff08;1&#xff09;串口图标的制作方法 &…