坚实原则:开放/封闭原则

先前我们讨论了单一责任原则。 关于实体原则首字母缩写, 打开/关闭原则是该行中的第二个原则。

“软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改”

通过采用该原理,目标是在不修改模块源代码的情况下扩展模块的行为。

想象一下对我们的一种产品应用折扣的情况。 折扣服务将应用指定的折扣并返还​​折扣价。

当前,我们的系统只有一种折扣适用于所有成年人。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;
import java.math.RoundingMode;public class Discount {public BigDecimal apply(BigDecimal price) {BigDecimal percent = new BigDecimal("0.10");BigDecimal discount = price.multiply(percent);return price.subtract(discount.setScale(2, RoundingMode.HALF_UP));}
}

折扣服务应将此折扣应用于给出的价格。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;public class DiscountService {public BigDecimal applyDiscounts(BigDecimal price,Discount discount) {BigDecimal discountPrice = price.add(BigDecimal.ZERO);discountPrice = discount.apply(discountPrice);return discountPrice;}
}

但是,我们公司希望为老年人提供折扣,因此我们有老年人折扣。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;
import java.math.RoundingMode;public class SeniorDiscount {public BigDecimal apply(BigDecimal price) {BigDecimal percent = new BigDecimal("0.20");BigDecimal discount = price.multiply(percent);return price.subtract(discount.setScale(2, RoundingMode.HALF_UP));}
}

折扣服务使事情变得更加复杂,因为该服务必须同时应用成人折扣和老年人折扣。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;public class DiscountService {public BigDecimal applyDiscounts(BigDecimal price,Discount discount) {BigDecimal discountPrice = price.add(BigDecimal.ZERO);discountPrice = discount.apply(discountPrice);return discountPrice;}public BigDecimal applySeniorDiscount(BigDecimal price,SeniorDiscount discount) {BigDecimal discountPrice = price.add(BigDecimal.ZERO);discountPrice = discount.apply(discountPrice);return discountPrice;}}

通过这样做,我们修改了折扣服务源代码以扩展其行为。 同样,对于销售部门可能提出的每一种不同的折扣,折扣服务也会获得额外的方法。

为了遵循开放/封闭原则,我们将创建一个折扣界面。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;public interface Discount {BigDecimal apply(BigDecimal price);
}

默认折扣将重命名为AdultDiscount并实现折扣界面。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;
import java.math.RoundingMode;public class AdultDiscount implements Discount {@Overridepublic BigDecimal apply(BigDecimal price) {BigDecimal percent = new BigDecimal("0.10");BigDecimal discount = price.multiply(percent);return price.subtract(discount.setScale(2, RoundingMode.HALF_UP));}
}

SeniorDiscount也将实现Discount接口。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;
import java.math.RoundingMode;public class SeniorDiscount implements Discount {@Overridepublic BigDecimal apply(BigDecimal price) {BigDecimal percent = new BigDecimal("0.20");BigDecimal discount = price.multiply(percent);return price.subtract(discount.setScale(2, RoundingMode.HALF_UP));}
}

最后但并非最不重要的一点是,我们将对DiscountService进行重构,以便基于Discount接口应用折扣。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;public class DiscountService {public BigDecimal applyDiscounts(BigDecimal price,Discount[] discounts) {BigDecimal discountPrice = price.add(BigDecimal.ZERO);for(Discount discount:discounts) {discountPrice = discount.apply(discountPrice);}return discountPrice;}
}

通过这种方式,折扣服务将能够在不更改其源代码的情况下应用不同的折扣。

可以对折扣应用相同的原则。
假设我们希望在应用折扣时额外应用基本折扣。

package com.gkatzioura.solid.ocp;import java.math.BigDecimal;
import java.math.RoundingMode;public abstract class BasicDiscount implements Discount {@Overridepublic BigDecimal apply(BigDecimal price) {BigDecimal percent = new BigDecimal("0.01");BigDecimal discount = price.multiply(percent);return price.subtract(discount.setScale(2, RoundingMode.HALF_UP));}
}

通过扩展BasicDiscount类,我们可以在BasicDiscount的行为上获得更多折扣,并且还可以在不修改BasicDiscount源代码的情况下扩展此行为。

您可以在github上找到源代码。 下一个原理是liskov替换原理。

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

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

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

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

相关文章

trim函数 html,trim、stripslashes、htmlspecialchars函数

通过 PHP 验证表单数据我们要做的第一件事是通过 PHP 的 htmlspecialchars() 函数传递所有变量。在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:location.href(http://www.hacked.com)- 代码不会执行,因为会被…

有效的Java第三版有哪些新功能?

自从听说即将出版的有效Java 第三版以来,我一直想知道其中有什么新内容。 我假设将涵盖自Java 6以来引入Java的功能,的确如此。 但是,第三版Java开发人员经典版也有一些其他更改。 在本文中,我提供了有关在第三版中添加&#xff0…

综合知识计算机类编制,天津事业编综合知识是什么

天津事业编综合知识有三类,分别是文字综合类、财会类、计算机类,考试时根据岗位考试要求进行一类综合知识的考核,均为主客观性试题,考试时限为150分钟,满分为100分。综合知识(文字综合类)简介(一)测试内容综合知识(文字…

哥大计算机科学学费,哥大计算机科学专业成功案例解析!!!

学生背景:学生:刘同学本科背景:北京大学 生物工程专业GPA: 3.5/4.0雅思7.5 GRE320录取院校:哥伦比亚大学—MS in Computer Science计算机科学硕士规划分析:1、背景分析L同学本科读的是生物工程专业,因为同学…

moxy json介绍_MOXy是GlassFish 4中新的默认JSON绑定提供程序

moxy json介绍GlassFish 4现在可以提供完整的Java EE 7(JSR-342)平台。 EclipseLink为该发行版做出了一些重大贡献。 首先是提供JPA 2.1(JSR-338)实现。 我将在本文中介绍的第二个内容是EclipseLink MOXy,它现在是JAX-…

大学计算机科技论文格式,《中国科技论文在线》稿件格式

《中国科技论文在线》期刊以中国科技论文在线网站http://www.paper.edu.cn/ 为基础,对在线发表论文进行评审,将评选的优秀论文作为期刊的主要稿源。稿件格式如下:中文标题(20字以内)作者11,作者22,……(1. 学校 院系,城…

使用Spring Boot和React进行Bootiful开发

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 在过去的几年中,React受到了很多积极的报导,使其成为Java开发…

计算机图形学结课论文,计算机图形学结课论文精要.doc

计算机图形学结课论文精要2017届结课论文《计算机图形学基础教程》—小球的弹跳运动学生姓名学 号所属学院专 业 计算机科学与技术班 级塔里木大学教务处制目录摘 要11.背景11.1计算机图形学概述11.2计算机图形画面的分类22.OpenGL概述22.1程序的基本结构32.2状态机制43.方案论…

word计算机基础考试题及答案,计算机基础习题及答案题库(期末考试)-word资料(精).doc...

文档介绍:1. 计算机的诞生: 第一台电子计算机是 1946 年在美国诞生的,该机的英文缩写是。答案(A)ENIAC 2. 计算机的诞生: 第一台电子计算机诞生于______ 。答案(C) 美国 3. 计算机的诞生: 第一台电子计算机诞生于______ 。答案(C)1946 年 4. 计算机的诞生: 世界上公…

编译hotspot_从Hotspot JIT编译器打印生成的汇编代码

编译hotspot有时,在对Java应用程序进行性能分析时,有必要了解Hotspot JIT编译器生成的汇编代码。 这对于确定已做出的优化决策以及我们的代码更改如何影响生成的汇编代码非常有用。 在调试并发算法以确保已按预期应用可见性规则时,知道何时发…

计算机硬盘按不同接口,硬盘接口不同 速度差别竟然这么大

硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据。不同的硬盘接口决定着硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的类型以及好坏都会直接影响程序运行快慢。说到硬盘接口我们常见的有SATA、PCI-E、M…

计算机导论设计实验,基于抽象知识点的《计算机导论》实验软件设计

Development of Experiment Software for《Computing Essentials》based on the Abstract Knowledge Points1、 College of Computer and Information Science, Southwest University, Chongqing, 400715Abstract:This paper develops an experiment software for 《…

使用Java的@Deprecated前瞻

我偶尔遇到一种情况,我需要引入新的API或构造以供其他人试用,但是我知道在使用某些API后,它可能会根据其他人的反馈而改变。 在这种情况下,我想以某种方式注释该构造,以警告其他开发人员此新添加的构造的暂定性。 在这…

计算机组成原理setb,计算机组成原理与汇编语言4

第四章指令系统指令系统概述指令系统是指某一种计算机所有指令的集合。对计算机而言,这是一组二进制数的输入,实际上是一组电平的输入。这些输入能在一个指令周期内产生人们预先规定的动作。显然这不是一组随机的二进制数据输入。指令系统是联系硬件和软…

计算机通信系统分哪两类,通信系统的组成(数字通信系统由哪几部分组成)

基本系统一般由信源(始发设备)、信宿(接收设备)和信道(传输介质)方式来自源的信息(语言、字符、图像或数据)由终端设备(如电话、电传打字机、传真机或数据终端设备等)转换成电信号。)在发送方,然后由始发设备编码、调制、放大或发送,然后基带信号被转换成…

nosql非关系型数据库_从Datomic出发,革命性的非NoSQL数据库

nosql非关系型数据库我终于设法了解了当今最不寻常的数据库之一,Datomic,并希望与您分享。 感谢Stuart Halloway和他的工作室! 为什么?!? 我们很快就会看到,Datomic与传统的RDBMS数据库以及各种…

你活在一个计算机模拟中吗,一麻省理工教授认为,我们更有可能生活在计算机模拟宇宙中...

一位麻省理工学院的教授表示,我们“更有可能”生活在某种模拟宇宙中,因为我们自己离能够创造超现实的模拟也不远了。(参见在接受解释性网站Vox采访时,计算机科学家Rizwan Virk认为,如果我们生活在信息世界而不是物质世界中&#x…

尽早查看针对Java 11的功能

随着JDK 10即将进入其发布候选阶段 ,有趣的是,开始通过JDK 11观察之后会发生什么。 在撰写本文时,四个JEP ( JDK增强建议 )已正式成为JDK 11的目标(可能会出现)。 这篇文章总结了当前针对JDK 11…

如何在命令行情重启计算机,如何应对“命令式”行情

如果说十月维稳行情,是以劝说,号召并佐以缓发新股为主要行政手段,那么十一月行情的主要特征就是“命令式”的。实践证明,十月行情并不咋地,虎头蛇尾,说明主力并不十分听话,也不卖力,…

服务器系统开机提示0xc000007b,0xc000007b蓝屏解决方法

0xc000007b是一种常见的蓝屏代码,导致出现此蓝屏代码的原因有很多,BIOS设置问题,驱动问题,硬件问题等等。硬件问题对于我们小白来说解决起来有点困难。我给大家带来了解决0xc000007b蓝屏软件问题的方法,赶紧来瞧瞧吧0x…