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

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

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

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

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

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

坚实原则:开放/封闭原则相关推荐

  1. 单一原则,开放-封闭原则,依赖反转,里氏族替换原则

    读书笔记:大话设计模式 单一职责原则 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 例子 一个俄罗斯方块游戏设计思路 其中游戏业务逻辑: 数据的每一项值变化的问题,下落,旋转,碰 ...

  2. 软件设计原则 — 开放封闭原则

    一.开闭原则的定义 Software entities like classes,modules and functions should be open for extension but clos ...

  3. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  4. 设计原则--开放-封闭原则(OCP)

    2019独角兽企业重金招聘Python工程师标准>>> 软件实体(类.模块.函数等等)应该是可以扩展的,但是不能修改的. 如果程序中的一处改动就会产生连锁反应,导致一系列样模块的改动 ...

  5. 面象对象设计6大原则之二:开放封闭原则

    转载自 面象对象设计6大原则之二:开放封闭原则 开放封闭原则(OCP),The Open Closed Principle 定义 一个软件的实体,包括类.方法.模块.应该对扩展开放,对修改关闭. 也就 ...

  6. 设计原则之一:开放封闭原则

    1:什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放(open),则修改关闭(不修改原来的代码这就是closed).在设计一个模块时,应当使得 ...

  7. 朝着理想坚实迈进_坚实原则:开放/封闭原则

    朝着理想坚实迈进 先前我们讨论了单一责任原则. 关于实体原则首字母缩写, 打开/关闭原则是该行中的第二个原则. "软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改" ...

  8. 博客园第一天,开放封闭原则

    (以下内容来自网络,只为加深理解) 开放封闭原则 软件实体软件实体应该是可扩展,而不可修改的. 开放:扩展 封闭:修改 对扩展开放意味着在又新的需求或变化时,可以对代码进行扩展,以适应新的情况. 对修 ...

  9. 嘻哈说:开放封闭原则

    1.定义 之前我们已经说过: <嘻哈说:单一职责原则> <嘻哈说:里氏替换原则> <嘻哈说:依赖倒置原则> <嘻哈说:接口隔离原则> <嘻哈说:迪 ...

最新文章

  1. 用于自动驾驶的实时车道线检测和智能告警
  2. mfc 制作不同的文档模板mdi不同的子窗体_制作ACK集群自定义节点镜像的正确姿势...
  3. 计算最大回撤_量化扫盲:什么是最大回撤?
  4. Nutch爬虫解决页面相对路径问题
  5. 2410 中断过程处理分析
  6. 【Pytorch神经网络理论篇】 22 自编码神经网络:概述+变分+条件变分自编码神经网络
  7. ServiceComb的开放性设计
  8. linux的ftp指令发邮件,三种使用Linux命令发送邮件
  9. java代码鸡兔同笼_鸡兔同笼 java代码
  10. 4x4矩阵键盘c语言程序,C语言矩阵键盘程序
  11. oracel的安装和卸载
  12. 前端实现antd文本域限制字数
  13. qq接收不了文件显示服务器拒绝,QQ提示服务器拒绝了您发送离线文件怎么办
  14. STM32+华为云IOT设计的动态密码锁
  15. 数据库错误代码:1055(Error Number: 1055) 解决方法
  16. 实验二 面向对象(一)(预习报告)
  17. php邮件群发系统日发5000,最新qq邮件群发日发10000封邮件
  18. 高级端点保护 (AEP) 简介
  19. Office 如何添加Adobe Acrobat虚拟PDF打印机
  20. vue缓存服务器文件到本地,vue中,在本地缓存中读写数据的方法

热门文章

  1. HighChart模拟点击series的name显示隐藏
  2. eclipse搭建多module项目的坑
  3. Java 虚拟机对锁优化所做的努力
  4. 对Java的URL类支持的协议进行扩展的方法
  5. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
  6. List实现类中调用下标删除VS调用元素删除
  7. React向对象数组进行赋值
  8. 阿里云服务器本地连接(windows) 阿里云服务器和本地的磁盘共享数据
  9. BigDecimal类的使用
  10. 三级pc技术_第十九周PC、笔电、数码周边新品汇总:AMD英特尔激战正酣