坚实原则:开放/封闭原则
先前我们讨论了单一责任原则。 关于实体原则首字母缩写, 打开/关闭原则是该行中的第二个原则。
“软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改”
通过采用该原理,目标是在不修改模块源代码的情况下扩展模块的行为。
想象一下对我们的一种产品应用折扣的情况。 折扣服务将应用指定的折扣并返还折扣价。
当前,我们的系统只有一种折扣适用于所有成年人。
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
坚实原则:开放/封闭原则相关推荐
- 单一原则,开放-封闭原则,依赖反转,里氏族替换原则
读书笔记:大话设计模式 单一职责原则 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 例子 一个俄罗斯方块游戏设计思路 其中游戏业务逻辑: 数据的每一项值变化的问题,下落,旋转,碰 ...
- 软件设计原则 — 开放封闭原则
一.开闭原则的定义 Software entities like classes,modules and functions should be open for extension but clos ...
- 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)
设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...
- 设计原则--开放-封闭原则(OCP)
2019独角兽企业重金招聘Python工程师标准>>> 软件实体(类.模块.函数等等)应该是可以扩展的,但是不能修改的. 如果程序中的一处改动就会产生连锁反应,导致一系列样模块的改动 ...
- 面象对象设计6大原则之二:开放封闭原则
转载自 面象对象设计6大原则之二:开放封闭原则 开放封闭原则(OCP),The Open Closed Principle 定义 一个软件的实体,包括类.方法.模块.应该对扩展开放,对修改关闭. 也就 ...
- 设计原则之一:开放封闭原则
1:什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放(open),则修改关闭(不修改原来的代码这就是closed).在设计一个模块时,应当使得 ...
- 朝着理想坚实迈进_坚实原则:开放/封闭原则
朝着理想坚实迈进 先前我们讨论了单一责任原则. 关于实体原则首字母缩写, 打开/关闭原则是该行中的第二个原则. "软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改" ...
- 博客园第一天,开放封闭原则
(以下内容来自网络,只为加深理解) 开放封闭原则 软件实体软件实体应该是可扩展,而不可修改的. 开放:扩展 封闭:修改 对扩展开放意味着在又新的需求或变化时,可以对代码进行扩展,以适应新的情况. 对修 ...
- 嘻哈说:开放封闭原则
1.定义 之前我们已经说过: <嘻哈说:单一职责原则> <嘻哈说:里氏替换原则> <嘻哈说:依赖倒置原则> <嘻哈说:接口隔离原则> <嘻哈说:迪 ...
最新文章
- 用于自动驾驶的实时车道线检测和智能告警
- mfc 制作不同的文档模板mdi不同的子窗体_制作ACK集群自定义节点镜像的正确姿势...
- 计算最大回撤_量化扫盲:什么是最大回撤?
- Nutch爬虫解决页面相对路径问题
- 2410 中断过程处理分析
- 【Pytorch神经网络理论篇】 22 自编码神经网络:概述+变分+条件变分自编码神经网络
- ServiceComb的开放性设计
- linux的ftp指令发邮件,三种使用Linux命令发送邮件
- java代码鸡兔同笼_鸡兔同笼 java代码
- 4x4矩阵键盘c语言程序,C语言矩阵键盘程序
- oracel的安装和卸载
- 前端实现antd文本域限制字数
- qq接收不了文件显示服务器拒绝,QQ提示服务器拒绝了您发送离线文件怎么办
- STM32+华为云IOT设计的动态密码锁
- 数据库错误代码:1055(Error Number: 1055) 解决方法
- 实验二 面向对象(一)(预习报告)
- php邮件群发系统日发5000,最新qq邮件群发日发10000封邮件
- 高级端点保护 (AEP) 简介
- Office 如何添加Adobe Acrobat虚拟PDF打印机
- vue缓存服务器文件到本地,vue中,在本地缓存中读写数据的方法