精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發(fā)
本文通過一個電商中庫存實例,演示了開閉原則的整個抽象和實現(xiàn)過程,并給出了開閉原則最常用的三種實現(xiàn)方式。

真實工作中,你是否是這樣操作過:一個需求過來,把原來的代碼改一遍,再一個需求過來,又把上一個需求的代碼改一遍,很多重復(fù)的工作還是在日復(fù)一日的重復(fù),有什么好的辦法改善嗎?

相信有經(jīng)驗的小伙伴一定聽過:對擴展開放,對修改關(guān)閉。那么,你知道這句話的真正含義嗎?今天我們來聊聊開閉原則到底是怎么實現(xiàn)的。

什么是開閉原則?

開放封閉原則,英文是:Open–closed principle, 簡稱OCP,是該原則是 Bertrand Meyer 在1988年提出的,最后被 Robert C. Martin收錄到 SOLID原則,開閉原則指出:


Software entities should be open for extension, but closed for modification.


軟件實體應(yīng)該對擴展開放,對修改關(guān)閉。

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

"對擴展開放,對修改關(guān)閉",如何理解呢?我們先看一個案例,如下圖,給出了電商領(lǐng)域庫存系統(tǒng)庫存變更的簡易模型圖,庫存系統(tǒng)接收外部系統(tǒng)庫存變更事件,然后對數(shù)據(jù)庫中的庫存進行修改。

面對這個業(yè)務(wù)需求,很多人的代碼會寫出這樣:

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

這時,新的需求來了:WMS倉儲系統(tǒng)內(nèi)部會產(chǎn)生盤點事件(盤盈/盤虧),這些事件會導(dǎo)致變更庫存。于是,代碼就會發(fā)展成下面這樣:

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 盤虧事件   庫存操作
        }
    }
}

很顯然,上述代碼的實現(xiàn),每來一個需求,就需要修改一次代碼,在方法中增加一個 else if分支,因此 Stock類就一直處于變更中,不穩(wěn)定。

有沒有什么好的辦法,可以使得這個代碼不用被修改,但是又能夠靈活的擴展,滿足業(yè)務(wù)需求呢?

這個時候我們就要搬出 java的三大法寶:繼承,實現(xiàn),多態(tài)。

我們發(fā)現(xiàn)整個業(yè)務(wù)模型是:事件導(dǎo)致庫存變更。所以,能不能把事件抽離出來?把它抽象成一個接口,代碼如下:

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

每種事件對應(yīng)一種庫存變更,抽象成一個具體的實現(xiàn)類,代碼如下:

入庫事件

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

出庫事件

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

xxx事件

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

最后,Stock類中 updateStock()庫存變更邏輯就可以抽象成下面這樣:

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

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

開閉原則是常見方式

在Java編程中,遵循開閉原則的常見方式有:使用抽象類和接口、使用策略模式、使用裝飾器模式等。

1.抽象類和接口

抽象類和接口是 Java中實現(xiàn) 開閉原則的基礎(chǔ),通過定義抽象類或接口,程序員可以在不修改已有代碼的情況下,通過繼承或?qū)崿F(xiàn)來擴展新功能。因此,我們強烈建議:面向接口編程。

2.策略模式

策略模式是一種行為設(shè)計模式,允許在運行時選擇算法的實現(xiàn),策略模式通過定義一系列算法,并將每個算法封裝在獨立的類中,使得它們可以相互替換。

在上面的示例講解中,其實使用的就是策略模式,當后期有其他的庫存事件時,我們只需要添加擴展類,而無需修改現(xiàn)有的代碼。

3.裝飾器模式

裝飾器模式是一種結(jié)構(gòu)設(shè)計模式,允許向一個對象動態(tài)添加行為。裝飾器模式通過創(chuàng)建一個裝飾器類來包裝原始類,從而增加新的功能。示例代碼:

// 定義一個接口
public interface Coffee {
    String getDescription();
    double getCost();
}

// 實現(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();
    }
}

// 實現(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());
    }
}

在這個示例中,Coffee接口定義了獲取描述和成本的方法,SimpleCoffee類實現(xiàn)了這個接口。CoffeeDecorator類是一個抽象類,實現(xiàn)了 Coffee接口,并持有一個 Coffee對象。MilkDecorator和SugarDecorator類分別繼承了CoffeeDecorator類,并擴展了其功能。如果我們需要增加新的裝飾器,只需要繼承 CoffeeDecorator類并實現(xiàn)其方法即可,而無需修改現(xiàn)有的代碼。

總結(jié)

本文通過一個電商中庫存實例,演示了開閉原則的整個抽象和實現(xiàn)過程,并給出了開閉原則最常用的 3種實現(xiàn)方式。

開閉原則的核心是對擴展開放,對修改關(guān)閉,因此,當業(yè)務(wù)需求一直需要修改同一段代碼時,我們就得多思考代碼修改的理由是什么?它們之間是不是有一定的共同性?能不能把這些變更點分離出來,通過擴展來實現(xiàn)而不是修改代碼?

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

可能有小伙伴會反駁,業(yè)務(wù)場景有類似的場景,但是邏輯簡單,幾個 if-else就搞定了,沒有必要去搞這么復(fù)雜的設(shè)計。

本人建議:功夫在平時,功夫在細節(jié)。

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

責任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2024-07-12 14:27:36

2023-05-05 08:18:38

Linuxsource命令

2020-01-14 10:57:39

內(nèi)存泄漏虛擬機

2017-03-21 23:29:44

DevOps運維開發(fā)

2022-09-07 08:41:57

SpringIstio分布式

2019-01-17 14:35:01

2015-06-04 10:26:50

2024-06-03 07:57:32

LLMLlama 2token

2023-04-27 13:09:10

MLOps工程師軟技能

2012-04-16 15:14:47

web設(shè)計

2023-12-27 08:36:27

2021-12-14 10:25:59

元宇宙技術(shù)Web

2009-09-16 09:39:50

ccna是什么CCNA

2009-07-07 16:50:39

ServletResp

2009-03-26 15:48:00

2013-02-21 15:40:02

SDN

2011-06-07 16:56:40

LDAP

2009-07-15 15:47:49

iBATIS是什么

2024-09-04 15:28:20

2013-12-19 15:56:50

去IOE數(shù)據(jù)庫服務(wù)器
點贊
收藏

51CTO技術(shù)棧公眾號

中文字幕久久一区| 亚洲欧美综合| 久久在线精品| 欧美日韩二区三区| 97在线视频免费播放| 欧美性猛交xxx乱久交| 精品区在线观看| 九九精品久久| 午夜精品在线看| 91久久久久久久久久久久久| 在线观看福利片| 成人福利影视| 亚洲色图插插| 欧美日韩综合一区| 日韩精彩视频| 欧美日韩综合在线观看| 日本在线成人| 国产精品国产馆在线真实露脸| 欧美一级高清免费| 中文字幕在线播放视频| 欧美xxxx黑人又粗又长| 国内不卡的二区三区中文字幕| 国产一区二区三区在线观看视频| 国产高潮呻吟久久久| 无码免费一区二区三区| 香蕉久久夜色精品国产使用方法 | 男女污污的视频| www.精品久久| 日韩av不卡在线观看| 精品无人区乱码1区2区3区在线| 欧美做受777cos| 亚洲综合精品在线| 国产高清久久| 91精品国产综合久久蜜臀| 一区二区三视频| 性感美女视频一二三| 在线看片日韩| 亚洲精品www久久久久久广东| 国产真人做爰毛片视频直播| 蜜臀久久久久久999| 激情婷婷久久| 日韩在线一区二区三区免费视频| 91亚洲免费视频| 免费网站免费进入在线| 国产一区二区三区观看| 欧美激情精品久久久久久| 美女搡bbb又爽又猛又黄www| h片精品在线观看| 97se亚洲国产综合自在线不卡 | 国产一区二区精品免费| 久久婷婷国产麻豆91| 国产精品流白浆在线观看| 婷婷丁香激情综合| 欧洲一区二区日韩在线视频观看免费| 一级黄色av片| 国产欧美三级| 中文字幕在线观看亚洲| 日韩欧美中文视频| 高潮在线视频| 欧美国产成人精品| 91九色偷拍| 日韩在线观看第一页| av中字幕久久| 91精品国产品国语在线不卡| 亚洲 自拍 另类小说综合图区| 国产黄色在线网站| jvid福利写真一区二区三区| 国产高清在线不卡| 中文字幕手机在线观看| 亚洲国产精品嫩草影院久久av| 欧美在线视频日韩| 91免费版看片| 成人黄色网址| 亚洲免费av在线| 免费在线观看91| 国产在成人精品线拍偷自揄拍| 欧美日韩一卡| 国产一区二区黄| 亚洲图片另类小说| 午夜精品久久久久久毛片| 亚洲国产美国国产综合一区二区 | 人体久久天天| 欧美久久久久中文字幕| 国产美女网站在线观看| 免费黄网站在线播放| 综合在线观看色| 免费成人av网站| 福利小视频在线观看| 成人午夜激情影院| 国产自产女人91一区在线观看| 国产成人精品a视频一区| 99riav国产精品| 欧美成人性生活| 国产99在线 | 亚洲| 日韩精品欧美大片| 国产亚洲精品久久久久久777| 久久免费手机视频| 久久不见久久见中文字幕免费| 亚洲色图欧美制服丝袜另类第一页| 手机在线播放av| 成人国产精品一区二区免费麻豆| 午夜精品久久久久| 久久精品网站视频| 午夜欧美激情| 亚洲国产精品精华液网站| 国产黄视频在线| 狂野欧美激情性xxxx欧美| 欧美日韩免费区域视频在线观看| 精品一区二区三区无码视频| 免费在线观看av| 亚洲国产毛片aaaaa无费看| 老司机午夜av| 亚洲精品一区| 69av一区二区三区| 免费的av网站| 99视频精品全部免费在线视频| 久久久久国产精品www| 欧美成人综合色| 久久九九国产| 欧洲午夜精品久久久| 日韩免费一级片| 美日韩一级片在线观看| 欧美综合国产精品久久丁香| 国产精品一区二区三区在线免费观看| 99视频精品全部免费在线| 亚洲免费视频一区| 丝袜美腿美女被狂躁在线观看| 91亚洲精品乱码久久久久久蜜桃| 一区二区三区av| 黄色成年人视频在线观看| 中文字幕欧美一| 人妻精品无码一区二区三区| 美女91在线看| 欧美性猛交xxxx乱大交3| 99福利在线观看| 黑人巨大精品| 欧美视频在线一区二区三区 | 国产精品免费视频xxxx| www.久久久久久久| 成人一道本在线| 亚洲自拍偷拍一区二区三区| 久久久人成影片一区二区三区在哪下载| 欧美性高潮在线| 性高潮久久久久久| 91精品综合| 欧美精品aaa| 国产乱码一区二区| 国产精品久久网站| 老司机激情视频| 国产在线美女| 日韩免费性生活视频播放| 精品中文字幕在线播放| 欧美精品自拍| 91午夜理伦私人影院| 麻豆视频在线观看免费网站| 欧美色图一区二区三区| 国产免费一区二区三区网站免费| 新67194成人永久网站| 国产精品视频精品视频| 国产在线播放av| 亚洲青青青在线视频| 无码av天堂一区二区三区| 亚洲最新无码中文字幕久久| 亚洲国产成人精品一区二区 | 国产亚洲精品一区二555| 国产又大又黄又粗| 久久精品国产免费| 国产伦理久久久| 国产在线观看网站| 欧美在线观看一二区| 亚洲精品一区二区三区影院忠贞| 久久一区二区三区超碰国产精品| 欧洲精品码一区二区三区免费看| 日本欧美韩国| 精品免费99久久| 精品人妻无码一区二区三区换脸| 免费亚洲一区| 日韩欧美亚洲在线| 91精品国产自产观看在线| 日韩av影片在线观看| 看黄色录像一级片| 欧美亚洲免费| 欧美一二三四五区| 日韩免费在线电影| 欧美国产乱视频| 少妇人妻偷人精品一区二区| 国产精品乱码一区二区三区软件 | 国产乱码精品一区二区三区中文 | 91免费视频观看| 国产高清精品软男同| 成人av在线播放| 国产一区二区三区在线看| 一炮成瘾1v1高h| 久久久久久久久久久久久女国产乱| 国产一级黄色录像片| 国产精品自在线拍| 国产精品v片在线观看不卡| 污视频网站在线播放| 色婷婷香蕉在线一区二区| 久久国产免费视频| 一区二区三区在线| 国产综合色一区二区三区| 精品日韩视频| 久久99精品久久久久久琪琪| 亚洲一卡二卡在线| 亚洲一区二区黄色| 18禁一区二区三区| 视频一区免费在线观看| 玖玖精品在线视频| 成人97精品毛片免费看| 97碰在线观看| 麻豆网站在线观看| 亚洲人成人99网站| 亚洲第一页视频| 一区二区三区四区av| 精品无码av一区二区三区不卡| 免费在线日韩av| 精品一区二区成人免费视频| 在线一级成人| 成人免费视频网站| sm在线观看| 中文字幕日韩av| 婷婷视频在线观看| 欧美一区二区视频免费观看| 中文字幕av影院| 久久久综合视频| 日韩av播放器| 亚洲人人精品| 狼狼综合久久久久综合网| 国产麻豆精品| 国产精品欧美久久久| 在线黄色的网站| 欧美福利小视频| 欧美一区二区三区在线观看免费| 亚洲精品aⅴ中文字幕乱码| 国产乱子伦精品无码码专区| 在线国产电影不卡| 免费看日韩毛片| 亚洲综合丝袜美腿| 日本一级大毛片a一 | 日韩激情视频一区二区| 91九色精品| 天堂一区二区三区| 9.1麻豆精品| 国产精品丝袜高跟| 菠萝菠萝蜜在线观看| 自拍偷拍亚洲在线| 成人午夜电影在线观看| 555夜色666亚洲国产免| 国产又粗又猛又黄视频| 欧美日韩一区二区在线| 日韩三级视频在线播放| 亚洲电影激情视频网站| 国产一级黄色av| 99久久免费视频.com| 亚洲成人精品在线播放| 国产老肥熟一区二区三区| 奇米影视亚洲色图| 亚洲视频综合| 日韩激情视频| 欧美日韩一二三四| 亚洲二区三区四区| 99久久婷婷| 欧美与动交zoz0z| 欧美一区91| 国产 欧美 日韩 一区| 一区视频在线看| 国产免费黄色小视频| 香蕉久久夜色精品| 91视频免费版污| 老色鬼精品视频在线观看播放| 波多野结衣xxxx| 精品亚洲成a人| 波多野结衣中文字幕在线播放| 国产精品中文字幕一区二区三区| 日本泡妞xxxx免费视频软件| 成人免费高清在线| 黄瓜视频污在线观看| 国产乱对白刺激视频不卡| 四虎国产精品免费| 99久精品国产| 国产一区二区三区精品在线| 国产精品乱码一区二三区小蝌蚪| 91人妻一区二区三区蜜臀| 久久精品男人的天堂| 99久久久无码国产精品性波多| gogogo免费视频观看亚洲一| 国产精品成人一区二区三区电影毛片 | 久久午夜国产精品| 在线观看免费黄色网址| 亚洲综合在线免费观看| 中文字幕在线播| 91麻豆精品国产91久久久久久久久 | 欧美亚洲精品在线| 国产青春久久久国产毛片| 日韩高清一级| 中国成人亚色综合网站| 99成人精品| 日本高清一区二区视频| 日产国产高清一区二区三区| 日韩av片专区| 免费观看30秒视频久久| 风韵丰满熟妇啪啪区老熟熟女| 26uuu色噜噜精品一区二区| 国产黄色录像片| 五月婷婷激情综合| 一级黄色片在线观看| 亚洲精品美女在线| 超碰caoporn久久| 人人澡人人澡人人看欧美| 久久久久久爱| 亚洲a区在线视频| 老司机亚洲精品一区二区| 久久精品magnetxturnbtih| 欧美18xxxx| 中国成人在线视频| 美女网站久久| 欧美熟妇精品一区二区| 国产精品丝袜一区| 日产精品久久久| 日韩三级电影网址| 亚洲欧美另类综合| 亚洲成人激情图| 亚洲精品承认| 欧美亚洲另类制服自拍| 日韩最新av| 在线精品日韩| 肉肉av福利一精品导航| 网站一区二区三区| 9l国产精品久久久久麻豆| 人人澡人人澡人人看| 在线亚洲一区二区| 视频一区二区三区在线看免费看| 亚洲欧美三级伦理| avav免费在线观看| 欧美xxxx14xxxxx性爽| www.国产精品| 欧洲一区二区在线| 亚洲永久免费| 日本人添下边视频免费| 一二三四区精品视频| 国产成人精品无码高潮| 亚洲高清福利视频| 欧美色图天堂| 亚洲综合中文字幕68页| 99久久综合| 亚洲va在线va天堂va偷拍| 中文字幕乱码日本亚洲一区二区| 日韩在线视频不卡| 亚洲欧美综合区自拍另类| 成人性教育av免费网址| 精品一区久久久久久| 色综合天天综合网中文字幕| 国产一二三四区在线观看| 精品一区二区在线视频| 亚洲视频在线播放免费| 国产欧美一区二区在线| 欧美成人黄色网| 日韩精品一区二区三区老鸭窝| 亚洲大胆人体大胆做受1| 538国产精品一区二区在线| 国产精品白丝av嫩草影院| www.国产二区| 成人精品视频一区二区三区 | 国产日韩欧美一区二区三区乱码| 国产成人一级片| 亚洲欧美在线第一页| yiren22亚洲综合| 黄色免费高清视频| 国产精品一二三四五| 黄色激情视频在线观看| 欧美揉bbbbb揉bbbbb| 麻豆av在线免费看| 成人h猎奇视频网站| 日韩aaa久久蜜桃av| 精品一卡二卡三卡| 中文字幕免费观看一区| 国产精品一区二区免费视频| 欧美夫妻性生活视频| 亚洲都市激情| 天堂av2020| 亚洲国产视频直播| 精品成人一区二区三区免费视频| 国产精品精品一区二区三区午夜版| 91欧美在线| 激情综合网俺也去| 国产精品久久久久久亚洲毛片| av观看在线免费| 91国内在线视频| baoyu135国产精品免费| 宅男噜噜99国产精品观看免费| 国产精品资源在线| 亚洲黄网在线观看| 久久亚洲影音av资源网| 国产精品久久久久久妇女| 韩国成人一区| 青娱乐精品视频在线| 玖玖爱免费视频| 日韩无一区二区| 中文字幕乱码中文乱码51精品|