坚实原则:开放/封闭原则
先前我們討論了單一責任原則。 關于實體原則首字母縮寫, 打開/關閉原則是該行中的第二個原則。
“軟件實體(類,模塊,功能等)應打開以進行擴展,但應關閉以進行修改”
通過采用該原理,目標是在不修改模塊源代碼的情況下擴展模塊的行為。
想象一下對我們的一種產品應用折扣的情況。 折扣服務將應用指定的折扣并返還??折扣價。
當前,我們的系統只有一種折扣適用于所有成年人。
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;} }通過這種方式,折扣服務將能夠在不更改其源代碼的情況下應用不同的折扣。
可以對折扣應用相同的原則。
假設我們希望在應用折扣時額外應用基本折扣。
通過擴展BasicDiscount類,我們可以在BasicDiscount的行為上獲得更多折扣,并且還可以在不修改BasicDiscount源代碼的情況下擴展此行為。
您可以在github上找到源代碼。 下一個原理是liskov替換原理。
另外,我還編寫了備忘單,其中包含一些扎實的原則。
在鏈接中注冊以接收它。
翻譯自: https://www.javacodegeeks.com/2018/02/solid-principles-open-closed-principle.html
總結
以上是生活随笔為你收集整理的坚实原则:开放/封闭原则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux端口进程查看(linux端口进
- 下一篇: 有效的Java第三版有哪些新功能?