朝着理想坚实迈进_坚实原则:开放/封闭原则
朝著理想堅(jiān)實(shí)邁進(jìn)
先前我們討論了單一責(zé)任原則。 關(guān)于實(shí)體原則首字母縮寫, 打開/關(guān)閉原則是該行中的第二個(gè)原則。
“軟件實(shí)體(類,模塊,功能等)應(yīng)打開以進(jìn)行擴(kuò)展,但應(yīng)關(guān)閉以進(jìn)行修改”
通過采用該原理,目標(biāo)是在不修改其源代碼的情況下擴(kuò)展模塊的行為。
想象一下對(duì)我們的一種產(chǎn)品應(yīng)用折扣的情況。 折扣服務(wù)將應(yīng)用指定的折扣并返還??折扣價(jià)。
目前,我們的系統(tǒng)只有一種折扣適用于所有成年人。
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));} }折扣服務(wù)應(yīng)將此折扣應(yīng)用于給出的價(jià)格。
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));} }折扣服務(wù)使事情變得有些復(fù)雜,因?yàn)樵摲?wù)必須同時(shí)應(yīng)用成人折扣和老年人折扣。
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;}}通過這樣做,我們修改了折扣服務(wù)源代碼以擴(kuò)展其行為。 同樣,對(duì)于銷售部門可能提出的每一種不同的折扣,折扣服務(wù)也會(huì)獲得額外的方法。
為了遵循開放/封閉原則,我們將創(chuàng)建一個(gè)折扣界面。
package com.gkatzioura.solid.ocp;import java.math.BigDecimal;public interface Discount {BigDecimal apply(BigDecimal price); }默認(rèn)折扣將重命名為AdultDiscount并實(shí)現(xiàn)折扣界面。
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也將實(shí)現(xiàn)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));} }最后但并非最不重要的一點(diǎn)是,我們將對(duì)DiscountService進(jìn)行重構(gòu),以便基于Discount接口應(yīng)用折扣。
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;} }通過這種方式,折扣服務(wù)將能夠應(yīng)用不同的折扣而無(wú)需更改其源代碼。
可以對(duì)折扣應(yīng)用相同的原理。
假設(shè)我們希望有一個(gè)基本折扣可以在應(yīng)用折扣時(shí)額外應(yīng)用。
通過擴(kuò)展BasicDiscount類,我們可以在BasicDiscount的行為上獲得更多折扣,并且還可以在不修改BasicDiscount源代碼的情況下擴(kuò)展此行為。
您可以在github上找到源代碼。 下一個(gè)原理是liskov替換原理。
另外,我還編寫了備忘單,其中包含有關(guān)扎實(shí)原則的摘要。
在鏈接中注冊(cè)以接收它。
翻譯自: https://www.javacodegeeks.com/2018/02/solid-principles-open-closed-principle.html
朝著理想堅(jiān)實(shí)邁進(jìn)
總結(jié)
以上是生活随笔為你收集整理的朝着理想坚实迈进_坚实原则:开放/封闭原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机为什么卡顿反应慢
- 下一篇: php cdi_CDI和lambda的策