日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

開閉原則,開放的是什么?關(guān)閉的又是什么?

來源: 責(zé)編: 時(shí)間:2024-07-11 17:30:25 797觀看
導(dǎo)讀真實(shí)工作中,你是否是這樣操作過:一個(gè)需求過來,把原來的代碼改一遍,再一個(gè)需求過來,又把上一個(gè)需求的代碼改一遍,很多重復(fù)的工作還是在日復(fù)一日的重復(fù),有什么好的辦法改善嗎?相信有經(jīng)驗(yàn)的小伙伴一定聽過:對擴(kuò)展開放,對修改關(guān)閉。

真實(shí)工作中,你是否是這樣操作過:一個(gè)需求過來,把原來的代碼改一遍,再一個(gè)需求過來,又把上一個(gè)需求的代碼改一遍,很多重復(fù)的工作還是在日復(fù)一日的重復(fù),有什么好的辦法改善嗎?euz28資訊網(wǎng)——每日最新資訊28at.com

相信有經(jīng)驗(yàn)的小伙伴一定聽過:對擴(kuò)展開放,對修改關(guān)閉。那么,你知道這句話的真正含義嗎?今天我們來聊聊開閉原則到底是怎么實(shí)現(xiàn)的。euz28資訊網(wǎng)——每日最新資訊28at.com

什么是開閉原則?

開放封閉原則,英文是:Open–closed principle, 簡稱OCP,是該原則是 Bertrand Meyer 在1988年提出的,最后被 Robert C. Martin收錄到 SOLID原則,開閉原則指出:euz28資訊網(wǎng)——每日最新資訊28at.com

Software entities should be open for extension, but closed for modification.euz28資訊網(wǎng)——每日最新資訊28at.com

euz28資訊網(wǎng)——每日最新資訊28at.com

軟件實(shí)體應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。euz28資訊網(wǎng)——每日最新資訊28at.com

如何實(shí)現(xiàn)開閉原則?

"對擴(kuò)展開放,對修改關(guān)閉",如何理解呢?我們先看一個(gè)案例,如下圖,給出了電商領(lǐng)域庫存系統(tǒng)庫存變更的簡易模型圖,庫存系統(tǒng)接收外部系統(tǒng)庫存變更事件,然后對數(shù)據(jù)庫中的庫存進(jìn)行修改。euz28資訊網(wǎng)——每日最新資訊28at.com

euz28資訊網(wǎng)——每日最新資訊28at.com

面對這個(gè)業(yè)務(wù)需求,很多人的代碼會寫出這樣:euz28資訊網(wǎng)——每日最新資訊28at.com

public class Stock {    public void updateStock(String event){        if("outOfStock" == event){            // todo 出庫事件   庫存操作        }else if("warehousing" == event){            // todo 入庫事件   庫存操作        }    }}

這時(shí),新的需求來了:WMS倉儲系統(tǒng)內(nèi)部會產(chǎn)生盤點(diǎn)事件(盤盈/盤虧),這些事件會導(dǎo)致變更庫存。于是,代碼就會發(fā)展成下面這樣:euz28資訊網(wǎng)——每日最新資訊28at.com

public class Stock {    public void updateStock(String event){        if("outOfStock" == event){            // todo 出庫事件   庫存操作        }else if("warehousing" == event){            // todo 入庫事件   庫存操作        }else if("panSurplus" == event){            // todo 盤盈事件   庫存操作        }else if("loss" == event){            // todo 盤虧事件   庫存操作        }    }}

很顯然,上述代碼的實(shí)現(xiàn),每來一個(gè)需求,就需要修改一次代碼,在方法中增加一個(gè) else if分支,因此 Stock類就一直處于變更中,不穩(wěn)定。euz28資訊網(wǎng)——每日最新資訊28at.com

有沒有什么好的辦法,可以使得這個(gè)代碼不用被修改,但是又能夠靈活的擴(kuò)展,滿足業(yè)務(wù)需求呢?euz28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)時(shí)候我們就要搬出 java的三大法寶:繼承,實(shí)現(xiàn),多態(tài)。euz28資訊網(wǎng)——每日最新資訊28at.com

我們發(fā)現(xiàn)整個(gè)業(yè)務(wù)模型是:事件導(dǎo)致庫存變更。所以,能不能把事件抽離出來?把它抽象成一個(gè)接口,代碼如下:euz28資訊網(wǎng)——每日最新資訊28at.com

public interface Event {    void updateStock(String event);}

每種事件對應(yīng)一種庫存變更,抽象成一個(gè)具體的實(shí)現(xiàn)類,代碼如下:euz28資訊網(wǎng)——每日最新資訊28at.com

入庫事件euz28資訊網(wǎng)——每日最新資訊28at.com

public class WarehousingEvent implements Event {    public void updateStock(String event){        // 業(yè)務(wù)邏輯    }}

出庫事件euz28資訊網(wǎng)——每日最新資訊28at.com

public class OutOfStockEvent implements Event {    public void updateStock(String event){        // 業(yè)務(wù)邏輯    }}

xxx事件euz28資訊網(wǎng)——每日最新資訊28at.com

public class XXXEvent implements Event {    public void updateStock(String event){        // 業(yè)務(wù)邏輯    }}

最后,Stock類中 updateStock()庫存變更邏輯就可以抽象成下面這樣:euz28資訊網(wǎng)——每日最新資訊28at.com

public class Stock {    public void updateStock(String event){        // 根據(jù)事件類型獲取真實(shí)的實(shí)現(xiàn)類        Event event = getEventInstance(event);        // 庫存變更操作        event.updateStock();    }}

經(jīng)過抽象、分離和改造之后,Stock.updateStock()類就穩(wěn)定下來了,再也不需要每增加一個(gè)事件就需要增加一個(gè) else if分支處理,這種抽象帶來的好處也是很明顯的:每次有新的庫存變更事件,只需要增加一個(gè)實(shí)現(xiàn)類,其他的邏輯都不需要更改,當(dāng)庫存事件無效時(shí)只需要把實(shí)現(xiàn)類刪除即可。euz28資訊網(wǎng)——每日最新資訊28at.com

開閉原則是常見方式

在Java編程中,遵循開閉原則的常見方式有:使用抽象類和接口、使用策略模式、使用裝飾器模式等。euz28資訊網(wǎng)——每日最新資訊28at.com

1.抽象類和接口

抽象類和接口是 Java中實(shí)現(xiàn) 開閉原則的基礎(chǔ),通過定義抽象類或接口,程序員可以在不修改已有代碼的情況下,通過繼承或?qū)崿F(xiàn)來擴(kuò)展新功能。因此,我們強(qiáng)烈建議:面向接口編程。euz28資訊網(wǎng)——每日最新資訊28at.com

2.策略模式

策略模式是一種行為設(shè)計(jì)模式,允許在運(yùn)行時(shí)選擇算法的實(shí)現(xiàn),策略模式通過定義一系列算法,并將每個(gè)算法封裝在獨(dú)立的類中,使得它們可以相互替換。euz28資訊網(wǎng)——每日最新資訊28at.com

在上面的示例講解中,其實(shí)使用的就是策略模式,當(dāng)后期有其他的庫存事件時(shí),我們只需要添加擴(kuò)展類,而無需修改現(xiàn)有的代碼。euz28資訊網(wǎng)——每日最新資訊28at.com

3.裝飾器模式

裝飾器模式是一種結(jié)構(gòu)設(shè)計(jì)模式,允許向一個(gè)對象動態(tài)添加行為。裝飾器模式通過創(chuàng)建一個(gè)裝飾器類來包裝原始類,從而增加新的功能。示例代碼:euz28資訊網(wǎng)——每日最新資訊28at.com

// 定義一個(gè)接口public interface Coffee {    String getDescription();    double getCost();}// 實(shí)現(xiàn)接口的具體類public class SimpleCoffee implements Coffee {    @Override    public String getDescription() {        return "Simple Coffee";    }    @Override    public double getCost() {        return 5.0;    }}// 創(chuàng)建裝飾器抽象類public abstract class CoffeeDecorator implements Coffee {    protected Coffee decoratedCoffee;    public CoffeeDecorator(Coffee coffee) {        this.decoratedCoffee = coffee;    }    @Override    public String getDescription() {        return decoratedCoffee.getDescription();    }    @Override    public double getCost() {        return decoratedCoffee.getCost();    }}// 實(shí)現(xiàn)具體的裝飾器類public class MilkDecorator extends CoffeeDecorator {    public MilkDecorator(Coffee coffee) {        super(coffee);    }    @Override    public String getDescription() {        return decoratedCoffee.getDescription() + ", Milk";    }    @Override    public double getCost() {        return decoratedCoffee.getCost() + 1.5;    }}public class SugarDecorator extends CoffeeDecorator {    public SugarDecorator(Coffee coffee) {        super(coffee);    }    @Override    public String getDescription() {        return decoratedCoffee.getDescription() + ", Sugar";    }    @Override    public double getCost() {        return decoratedCoffee.getCost() + 0.5;    }}// 客戶端代碼public class CoffeeShop {    public static void main(String[] args) {        Coffee coffee = new SimpleCoffee();        System.out.println(coffee.getDescription() + " $" + coffee.getCost());        coffee = new MilkDecorator(coffee);        System.out.println(coffee.getDescription() + " $" + coffee.getCost());        coffee = new SugarDecorator(coffee);        System.out.println(coffee.getDescription() + " $" + coffee.getCost());    }}

在這個(gè)示例中,Coffee接口定義了獲取描述和成本的方法,SimpleCoffee類實(shí)現(xiàn)了這個(gè)接口。CoffeeDecorator類是一個(gè)抽象類,實(shí)現(xiàn)了 Coffee接口,并持有一個(gè) Coffee對象。MilkDecorator和SugarDecorator類分別繼承了CoffeeDecorator類,并擴(kuò)展了其功能。如果我們需要增加新的裝飾器,只需要繼承 CoffeeDecorator類并實(shí)現(xiàn)其方法即可,而無需修改現(xiàn)有的代碼。euz28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

本文通過一個(gè)電商中庫存實(shí)例,演示了開閉原則的整個(gè)抽象和實(shí)現(xiàn)過程,并給出了開閉原則最常用的 3種實(shí)現(xiàn)方式。euz28資訊網(wǎng)——每日最新資訊28at.com

開閉原則的核心是對擴(kuò)展開放,對修改關(guān)閉,因此,當(dāng)業(yè)務(wù)需求一直需要修改同一段代碼時(shí),我們就得多思考代碼修改的理由是什么?它們之間是不是有一定的共同性?能不能把這些變更點(diǎn)分離出來,通過擴(kuò)展來實(shí)現(xiàn)而不是修改代碼?euz28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)在業(yè)務(wù)開發(fā)中還有很多類似的場景,比如:電商系統(tǒng)中的會員系統(tǒng),需要根據(jù)用戶不同的等級計(jì)算不同的費(fèi)用;機(jī)票系統(tǒng),根據(jù)用戶不同的等級(普通,白金用戶,黃金用戶...)提供不同的售票機(jī)制;網(wǎng)關(guān)系統(tǒng)中,根據(jù)不同的粒度(接口,ip,服務(wù),集群)來實(shí)現(xiàn)限流;euz28資訊網(wǎng)——每日最新資訊28at.com

可能有小伙伴會反駁,業(yè)務(wù)場景有類似的場景,但是邏輯簡單,幾個(gè) if-else就搞定了,沒有必要去搞這么復(fù)雜的設(shè)計(jì)。euz28資訊網(wǎng)——每日最新資訊28at.com

本人建議:功夫在平時(shí),功夫在細(xì)節(jié)。euz28資訊網(wǎng)——每日最新資訊28at.com

很多人總抱怨業(yè)務(wù)開發(fā)技術(shù)成長慢,特別是對于初級程序員,但是大部門人的起點(diǎn)都是業(yè)務(wù)的 CRUD,如果能在業(yè)務(wù) CRUD過程中想辦法"挖掘"某些 設(shè)計(jì)模式,通過這種長期的刻意練習(xí),量變產(chǎn)生質(zhì)變,慢慢就能領(lǐng)會這些經(jīng)典設(shè)計(jì)原則的奧妙,終有一天也能寫出讓人賞心悅目的代碼。euz28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-100459-0.html開閉原則,開放的是什么?關(guān)閉的又是什么?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: IDC:蘋果 Vision Pro 今年銷量不超過 50 萬臺,平價(jià)款明年發(fā)布

下一篇: Python 數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)、字符串、列表、元組、字典)

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實(shí)踐!

    Java的NIO庫提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級

    來源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein“利用市場支配力量強(qiáng)迫服裝廠商與之簽訂獨(dú)家
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準(zhǔn)追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨(dú)家獲悉,拼多多在其APP內(nèi)上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內(nèi),目前主要售賣美食相關(guān)的
  • 阿里瓴羊One推出背后,零售企業(yè)迎數(shù)字化新解

    作者:劉曠近年來隨著數(shù)字經(jīng)濟(jì)的高速發(fā)展,各式各樣的SaaS應(yīng)用服務(wù)更是層出不窮,但本質(zhì)上SaaS大多局限于單一業(yè)務(wù)流層面,對用戶核心關(guān)切的增長問題等則沒有提供更好的解法。在Saa
  • 網(wǎng)紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業(yè)評論6月26日高調(diào)宣布入市,網(wǎng)絡(luò)名嘴大v胡錫進(jìn)居然進(jìn)軍了股市。在一次財(cái)經(jīng)媒體峰會上,幾個(gè)財(cái)經(jīng)圈媒體大佬就“胡錫進(jìn)炒股是否知道認(rèn)真報(bào)道”展開討論。有
  • 信通院:小米、華為等11家應(yīng)用商店基本完成APP簽名及驗(yàn)簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機(jī)助手、百度手機(jī)助手、應(yīng)用寶、豌豆莢和努比亞等9家應(yīng)用商店,以及抖音和快手2家新型應(yīng)用分發(fā)平
  • 中關(guān)村論壇11月25日開幕,15位諾獎級大咖將發(fā)表演講

    11月18日,記者從2022中關(guān)村論壇新聞發(fā)布會上獲悉,中關(guān)村論壇將于11月25至30日在京舉行。本屆中關(guān)村論壇由科學(xué)技術(shù)部、國家發(fā)展改革委、工業(yè)和信息化部、國務(wù)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品久久午夜夜伦鲁鲁| 久久精品国产91精品亚洲| 国产综合亚洲精品一区二| 国产一区二区视频在线观看| 怡红院精品视频| 亚洲国产精选| 一区二区三区四区五区精品视频| 亚洲一区二区三区中文字幕| 久久成人精品电影| 麻豆freexxxx性91精品| 欧美久久一级| 国产日韩在线播放| 亚洲欧洲精品一区二区| 亚洲一区二区欧美| 欧美在线资源| 欧美精品一区二区在线观看 | 欧美日韩中文字幕| 国产欧美日韩一级| 亚洲三级免费电影| 先锋影音国产一区| 欧美福利网址| 国产麻豆午夜三级精品| 亚洲激情网站| 性欧美暴力猛交另类hd| 欧美1区2区3区| 国产精品私拍pans大尺度在线| 亚洲福利视频在线| 午夜精品久久久| 欧美激情第4页| 国产一区深夜福利| 亚洲一级黄色av| 欧美mv日韩mv国产网站app| 国产精品爽爽爽| 亚洲日本视频| 久久精品在线| 国产精品人人做人人爽人人添| 亚洲国产裸拍裸体视频在线观看乱了 | 国产偷久久久精品专区| 日韩亚洲欧美高清| 久久视频一区| 国产精品日韩欧美| 亚洲理论电影网| 久久久久久久尹人综合网亚洲| 欧美体内she精视频在线观看| 在线日韩av永久免费观看| 性色av一区二区怡红| 欧美日韩一区二区三区免费| 在线欧美电影| 久久福利电影| 国产精品一区一区| 一区二区三区欧美激情| 欧美成人免费在线视频| 韩日精品在线| 欧美永久精品| 国产精品日韩一区二区三区| 日韩一级精品视频在线观看| 免费成人高清在线视频| 国模精品一区二区三区| 性18欧美另类| 国产精品狼人久久影院观看方式| 夜夜夜久久久| 欧美精品一区二区三区蜜桃| 亚洲国产成人91精品| 久久性天堂网| 黑人一区二区| 久久精品国产99| 国产女主播一区二区| 亚洲午夜小视频| 欧美日韩精品是欧美日韩精品| 亚洲黄色视屏| 欧美h视频在线| 亚洲国产日韩欧美在线99| 久久综合五月| 在线精品视频免费观看| 久久婷婷麻豆| 亚洲成色精品| 免费不卡在线观看| 亚洲激情在线激情| 免费欧美网站| 亚洲国产中文字幕在线观看| 噜噜噜在线观看免费视频日韩| 国产综合18久久久久久| 久久精品成人一区二区三区蜜臀 | 久久国产视频网站| 国产一区二区高清不卡| 欧美自拍偷拍| 加勒比av一区二区| 美女久久一区| 亚洲欧洲一区二区三区| 欧美日本乱大交xxxxx| 99视频一区| 欧美午夜精品伦理| 亚洲影院污污.| 国产欧美日韩视频| 久久久99爱| 亚洲大片在线观看| 欧美激情1区2区| 99香蕉国产精品偷在线观看| 欧美特黄一级| 性欧美8khd高清极品| 午夜精品在线视频| 国产欧美日本在线| 欧美在线亚洲一区| 激情亚洲网站| 欧美精品1区2区| 一区二区三区色| 国产精品私人影院| 久久精品国产99国产精品澳门| 一区二区三区自拍| 欧美激情一区在线观看| 亚洲无毛电影| 国产喷白浆一区二区三区| 久久久午夜电影| 亚洲美女中文字幕| 国产精品日韩二区| 一色屋精品视频在线看| 欧美日韩在线视频一区二区| 亚洲欧美日韩视频二区| 在线精品福利| 国产乱码精品一区二区三区忘忧草| 欧美高清视频一区二区| 亚洲女性喷水在线观看一区| 亚洲电影av在线| 在线观看av一区| 伊人一区二区三区久久精品| 国产欧美一区二区三区沐欲 | 亚洲欧美激情一区| 国产精品久久久久久亚洲调教| 亚洲一二三区在线| 国产欧美日韩高清| 中文亚洲欧美| 欧美激情一区二区三区全黄 | 国产精品羞羞答答| 国产欧美三级| 亚洲在线视频观看| 久久综合网hezyo| 国产精品永久免费视频| av成人动漫| 模特精品在线| 亚洲区免费影片| 午夜视频久久久| 美乳少妇欧美精品| 欧美日韩aaaaa| 99视频一区二区| 性一交一乱一区二区洋洋av| 久久国产免费看| 欧美系列精品| 亚洲视频碰碰| 国产精品影片在线观看| 性久久久久久| 狠狠色丁香久久综合频道| 欧美日韩精品中文字幕| 亚洲资源av| 亚洲第一色在线| 看欧美日韩国产| 国产亚洲人成网站在线观看| 久久国产一区| 亚洲日本国产| 国产在线一区二区三区四区| 欧美日本在线看| 欧美亚洲自偷自偷| 欧美午夜不卡视频| 亚洲午夜av电影| 国产精品无人区| 亚洲欧美变态国产另类| 国产精品亚洲一区| 一区二区三区导航| 欧美大片一区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 99视频精品在线| 一区二区在线视频观看| 国产精品久在线观看| 欧美日本在线看| 欧美激情国产精品| 久久这里有精品视频 | 欧美日韩一区二区在线播放| 国产真实乱偷精品视频免| 国产精品久久午夜夜伦鲁鲁| 欧美日韩国产一区二区三区| 欧美gay视频激情| 美女在线一区二区| 久久蜜桃资源一区二区老牛| 欧美伊人久久久久久午夜久久久久 | 日韩视频一区二区在线观看| 黑丝一区二区| 国产一区二区三区在线观看免费视频 | 欧美午夜精品久久久久免费视| 欧美高清视频www夜色资源网| 久久婷婷av| 久久久久久久综合色一本| 欧美一区二视频在线免费观看| 亚洲综合色激情五月| 亚洲一区二区三区激情| 一区二区三区毛片| 亚洲少妇在线| 一区二区三区视频在线观看| 日韩午夜在线视频| 亚洲伦理在线免费看| 亚洲精品视频一区| 亚洲免费观看高清在线观看| 亚洲精品视频啊美女在线直播| 亚洲茄子视频| 亚洲每日在线| 艳女tv在线观看国产一区|