liskov替换原则_坚实原则:Liskov替代原则

liskov替换原则

以前,我们深入研究了坚实的原则,包括单一责任和开放/封闭原则。
Liskov替代原则(LSP)是子类型关系的一种特殊定义,称为(强)行为子类型,

假设对象S是对象T的子类型,则可以用类型S的对象替换类型T的对象,而无需更改T的任何理想属性。

假设我们有Employee类。

package com.gkatzioura.solid.liskov;public class Employee {public void work() {System.out.println("Employee is working");}}

另外,我们还有另一个继承Employee类的类。

package com.gkatzioura.solid.liskov;public class EmployeeOnVacation extends Employee {@Overridepublic void work() {throw new IllegalArgumentException("Employees on vacation should not work");}
}

假设我们有一个项目。

package com.gkatzioura.solid.liskov;import java.util.List;public class Project {public void start(List<Employee> employees) {for(Employee employee:employees) {employee.work();}}
}

我们指派员工开始研究

List<Employee> employees = new ArrayList<>();employees.add(new EmployeeOnVacation());employees.add(new Employee());Project project = new Project();project.start(employees);

由于员工正在休假,结果将是一个例外,因此该项目将无法完成。
为了避免违反该原则,我们将使用不同的方法并建立两个不同的员工界面。
WorkingEmployee接口。

package com.gkatzioura.solid.liskov;public interface WorkingEmployee {public void work();
}

和非工作人员界面。

package com.gkatzioura.solid.liskov;public interface NonWorkingEmployee {void relax();
}

因此,该项目将仅使用作为WorkingEmployee接口的实现的员工。

List<WorkingEmployee> employees = new ArrayList<>();employees.add(new WorkingEmployeeImpl());Project project = new Project();project.start(employees);

您可以在github上找到源代码。 下一个原则是接口隔离原则。

另外,我还编写了备忘单,其中包含有关扎实原则的摘要。
在链接中注册以接收它。

翻译自: https://www.javacodegeeks.com/2018/02/solid-principles-liskov-substitution-principle.html

liskov替换原则

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

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

相关文章

java 聚合_Java聚合

聚合如果一个类有一个类的实体引用(类中的类)&#xff0c;则它称为聚合。 聚合表示HAS-A关系。考虑有一种情况&#xff0c;Employee对象包含许多信息&#xff0c;例如&#xff1a;id&#xff0c;name&#xff0c;emailId等。它包含另一个类对象&#xff1a;address&#xff0c;…

Linux 命令之 dpkg --Debian 的一个底层包管理工具

文章目录 一、命令介绍二、deb 软件包命名规则三、软件包管理相关文件/目录四、dpkg 数据库五、子命令六、常用选项(一)安装、升级和删除软件包(二)查询和检验软件包(三)其它七、命令示例(一)安装、升级和卸载软件包安装指定的软件包解开软件包到系统目录但不配置配置软…

java jep_Java 10 – JEP 286:局部变量类型推断

java jepJava 10即将发布&#xff0c;RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中&#xff0c;开发人员社区中最有趣且最受关注的是286&#xff1a;Local-Variable Type Inference 。 什么是局部变量类型推断&#xff1f; 我们在Java…

java ffmpeg 视频水印_java 实现视频转换通用工具类:视频加水印-Ffmpeg(五-1)

java 实现视频转换通用工具类&#xff1a;视频相互转换-Ffmpeg(三)说明&#xff1a;视频加水印支持右上角、左上角、左下角、右下角、底部居中几个方位1.根据水印文字---添加视频水印/*** 根据水印文字---添加视频水印* param srcPath 原视频路径* param tarVideoPath 生成后的…

手动 clone 安装 Homebrew

文章目录 手动 clone 安装 HomebrewHomebrew 换源替换 homebrew 源替换 homebrew-core 源替换 homebrew-bottles 源bash用户zsh 用户更新 Homebrew手动 clone 安装 Homebrew 首先进入 homebrew 目录:cd "$(brew --repo)/Library/Taps/homebrew/"创建目录 homebrew-c…

lambda 匿名内部类_Lambda运行时内部:窥视无服务器巢穴

lambda 匿名内部类有没有想过lambda里面是什么样的&#xff1f; 不要怀疑了 让我们找出答案。 自从2014年问世以来&#xff0c;AWS的lambda函数就成为一个热门话题&#xff0c;在无服务器计算领域开辟了全新的历史。 无状态&#xff0c;零维护&#xff0c;按次执行的好东西实际…

java VM argument_java之program arguments与VM arguments

program arguments 中的值作为 args[] 的参数传入的&#xff0c;而 VM Arguments 是设置的虚拟机的属性。program arguments 是要传给你的应用程序的&#xff0c;它通过主函数中的 args 来传值。 VM arguments是系统的属性&#xff0c;要传给 java 虚拟机的。如图&#xff1a;是…

java iterator 嵌套_Java中的集合嵌套

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public classDemo06 {public static voidmain(String[] args) {//大 MapHashMap> oraclenew HashMap>();//小MapHashMap java1018 new HashMap();HashMap java1227 new H…

Linux/Unix 如何查看 man 搜索到的手册页(manual page)的位置及复制手册页的内容

文章目录命令 man 是如何搜索手册页的&#xff1f;如何查看手册页所在的路径通过管道输出给 vim命令 man 是如何搜索手册页的&#xff1f; man uses a sophisticated method of finding manual page files, based on the invocation options and environment variables, the …

xml不利于调试_流利的接口不利于维护

xml不利于调试流畅的界面 &#xff08;最初由Martin Fowler 创造&#xff09;是一种与OOP中的对象进行通信的非常便捷的方式。 它使他们的外墙更易于使用和理解。 但是&#xff0c;它破坏了它们的内部设计&#xff0c;使它们更难以维护。 Marco Pivetta在他的博客文章Fluent In…

java输入月份求天数_java输入年份,月份,输出当月天数

package 第二次作业; public class 第二题 { //java文件名 public static void main(String[] args) { //相当于创建主函数 String 年份 = javax.swing.JOptionPane.showInputDialog("输入一个年份:"); //求出输…

java 换行 运算符格式_Java代码样式运算符换行格式

java 换行 运算符格式上周&#xff0c;我发现了什么决定了我在较长时间里一直在努力解决的问题的决定&#xff1a;是否放置&& &#xff0c; ||之类的运算符 或在同一行或下一行。 在构造布尔表达式或隐含字符串时&#xff0c;我们可能需要中断长行。 根据《 Google Ja…

pipeline java_架构模式:pipeline

知名的 Pipeline 模式unix 的 pipelinecat helloworld.txt | grep "hello world" | rev | > output.txt读取文本内容&#xff0c;并过滤 “hello world”&#xff0c;然后反转字符&#xff0c;将最终结果输出到 output.txtWeb 框架中间件Laravel 中的管道Laravel …

MacOS 系统使用命令安装软件包

文章目录 使用 Homebrew 安装软件包先安装 Homebrew使用命令 brew 安装软件包使用命令 installer 安装 pkg 软件包使用命令安装 dmg 格式的软件包包含普通的应用程序文件的 dmg 文件如何使用命令完成安装呢?包含 pkg 安装程序的 dmg 文件又该如何通过命令完成安装呢?Linux 操…

身份证验证 校验码_用户身份验证最佳做法清单

身份证验证 校验码用户身份验证是每个Web应用程序共享的功能。 我们已经实施了很多次了&#xff0c;所以早就应该完善它了。 然而&#xff0c;错误无时无刻不在。 造成这种情况的部分原因是&#xff0c;可能出错的事情列表很长。 您可能会错误地存储密码&#xff0c;可能会具有…

mysql查询不确定的信息_mysql 07.18

1.索引搜索引导&#xff0c;索引是一个特殊的数据结构&#xff0c;期存储的是数据的关键信息与详细详细的位置对应关系。目的&#xff1a;加速查询。索引的影响&#xff1a;不是说拥有索引就能加速&#xff0c;得看你的查询语句有没有正确使用索引&#xff0c;索引也需要占用额…

MacOS 常用命令汇总

文章目录设置环境变量列出所有可以更新的软件包直接更新所有可以更新的软件包打包压缩文件忽略 Mac OS 文件系统中的扩展属性忽略 Mac OS 专有的隐藏文件创建 DMG 格式的文件修改 DMG 文件的大小修改 DMG 格式中的加密口令挂载 DMG 格式的文件推出 DMG 文件将 ISO 格式的文件转…

java多功能钟_Java 11将包含更多功能

java多功能钟Java 11即将发布的功能是什么&#xff1f;它与Java 9和10有何不同&#xff1f; Java 10可能是新手&#xff0c;但现在该谈论Java 11了。Oracle迈向更快的发布周期意味着更多的特性和功能以比以往更快的速度出现。 尽管距离Java 11发行还有六个月的时间&#xff0…

MacOS 好用的插件和图形界面程序

文章目录文件预览插件OS X 图形界面程序文件预览插件 有些插件可以让 Mac 上的文件预览更有效&#xff0c;比如语法高亮、markdown 渲染、json 预览等。 $ brew cask install qlcolorcode $ brew cask install qlstephen $ brew cask install qlmarkdown $ brew cask install…

java 线程安全性_我如何测试Java类的线程安全性

java 线程安全性我在最近的一次网络研讨会中谈到了这个问题&#xff0c;现在是时候以书面形式进行解释了。 线程安全是Java等语言/平台中类的重要品质&#xff0c;在Java中我们经常在线程之间共享对象。 缺乏线程安全性导致的问题很难调试&#xff0c;因为它们是零星的&#xf…