精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲毛片在线免费| 亚洲无码精品国产| 久久国产精品色av免费看| 精品女同一区二区三区在线播放| 欧美精品一区二区三区四区五区 | 欧洲精品一区二区三区在线观看| 亚洲精品一区二区三区av| 精品人妻一区二区三区浪潮在线| 日韩天堂av| 色多多国产成人永久免费网站 | 成+人+亚洲+综合天堂| 国产成人黄色av| 丰满少妇高潮久久三区| 在线亚洲a色| 日韩三级视频在线观看| www.xxx亚洲| 91精品久久久| 久久精品一区蜜桃臀影院| 成人疯狂猛交xxx| 在线观看日本视频| 国产精品v日韩精品v欧美精品网站| 亚洲欧美日韩中文视频| 亚洲视频天天射| 精品久久久网| 91国产精品成人| 欧美 亚洲 视频| 免费网站成人| 久久久精品免费观看| av一本久道久久波多野结衣| wwwwww在线观看| 一本色道精品久久一区二区三区| 欧美精品在线观看| 后入内射无码人妻一区| 国产一区二区精品福利地址| 亚洲第一页在线| 丰满少妇中文字幕| 香蕉久久久久久| 欧洲精品一区二区三区在线观看| 91精品91久久久中77777老牛| 黄色一级大片在线免费看产| 国产精品伦理在线| 欧美一区二区三区成人久久片| 嫩草影院一区二区| 国产成人亚洲精品青草天美| 91在线观看免费高清完整版在线观看| 成人黄色激情视频| 日本视频一区二区| 日韩av免费一区| 国产农村妇女aaaaa视频| 亚洲精品偷拍| 午夜精品久久久久久久久久久久 | 亚洲成人原创| 欧美激情精品在线| 草视频在线观看| 牛夜精品久久久久久久99黑人| 日韩在线免费视频| 无码人妻精品中文字幕| 91视频综合| 久久精品美女视频网站| 成人做爰视频网站| 亚洲精品tv久久久久久久久久| 日韩在线中文视频| 国产老头老太做爰视频| 91tv精品福利国产在线观看| 久久精品国产亚洲7777| 亚洲二区在线播放| 国产一区日韩一区| 97人人模人人爽人人喊中文字 | 国产精品伊人日日| 亚洲av片在线观看| 国产欧美日韩在线看| 亚洲欧美日产图| 成人video亚洲精品| 亚洲日本一区二区三区| 黄色一级片黄色| 蜜桃视频动漫在线播放| 欧美性生活大片免费观看网址| 日本一极黄色片| 国产情侣一区二区三区| 日韩色视频在线观看| 久久久久久久无码| 欧美日韩在线网站| 久久这里只有精品视频首页| 日本三级网站在线观看| 美女尤物久久精品| 国产在线拍偷自揄拍精品| 国产富婆一级全黄大片| 99久久婷婷国产综合精品| 色噜噜狠狠一区二区三区| 黄色网页在线免费观看| 午夜电影一区二区三区| 欧美午夜性生活| 香蕉成人app| 亚洲人成电影网站色www| 亚洲区一区二区三| 亚洲精品黄色| 成人在线视频网站| 头脑特工队2免费完整版在线观看| 久久精品无码一区二区三区| 强开小嫩苞一区二区三区网站 | 成人高清视频观看www| 人妻与黑人一区二区三区| 国产色91在线| 欧美黄色免费网址| 精品日本视频| 亚洲国产精品字幕| 五月天色婷婷丁香| 久久国产精品99国产| 91精品国产一区二区三区动漫 | 国产激情视频一区| 精品人妻久久久久一区二区三区 | 欧美精品一区男女天堂| 一级片黄色录像| 国产亚洲精品自拍| 99精品国产高清在线观看| 国内在线精品| 亚洲成人综合视频| 在线播放免费视频| 欧美日韩性在线观看| 国产91|九色| 精品国产伦一区二区三区| 国产女人18水真多18精品一级做| 免费特级黄色片| 国产激情一区| 色一区av在线| 日本中文字幕在线观看视频| 成人av在线一区二区三区| 青少年xxxxx性开放hg| 日韩中文视频| 亚洲欧美成人网| 黄色片视频网站| 国产99久久久久| 三级在线免费观看| 亚洲一区二区av| 在线看福利67194| 国产成人无码专区| 久久综合九色综合97婷婷女人| 蜜臀精品一区二区| 日韩一区网站| 欧美激情18p| 动漫美女无遮挡免费| 日韩精品一区在线视频| 亚洲一区二区三区色| 四虎永久在线观看| 亚洲日本在线看| 911福利视频| 大色综合视频网站在线播放| 51久久精品夜色国产麻豆| 特级片在线观看| 中文无码日韩欧| 欧美精品在线播放| 国产绿帽一区二区三区| 国产精品久久久久毛片软件| 91视频免费版污| 欧美一站二站| 国产精品人成电影| 在线观看麻豆蜜桃| 欧美视频三区在线播放| 国产一区二区三区视频播放| 久久精品国产亚洲a| 亚洲资源视频| 欧美激情精品| 国内精品国产三级国产在线专| 男人天堂av网| 欧美性猛交视频| 国产7777777| 韩国女主播成人在线观看| 小说区视频区图片区| 日韩一区二区三区高清在线观看| 久久久久久久久久久亚洲| 黄色av小说在线观看| 福利微拍一区二区| 男人舔女人下部高潮全视频| 美女久久久精品| 操bbb操bbb| 久久久久97| 国产精品日韩精品| 黄色网在线播放| 亚洲国产三级网| 波多野结衣日韩| 亚洲人午夜精品天堂一二香蕉| 丰满人妻一区二区三区大胸 | 国产在线视频综合| 欧美大片网址| 国产日韩欧美在线播放| 成全电影大全在线观看| 国产午夜精品全部视频播放| 国产男女无套免费网站| 天天操天天综合网| eeuss中文字幕| a级精品国产片在线观看| 亚洲一区二区蜜桃| 黄色av一区| 亚洲欧洲三级| 欧美久久香蕉| 91精品国产综合久久男男| www成人免费观看| 深夜福利亚洲导航| 天天av综合网| 欧美一区二区三区免费大片 | a篇片在线观看网站| 日韩激情在线视频| 国产色综合视频| 在线亚洲一区二区| 日本三级欧美三级| 亚洲日本电影在线| 免费看日本黄色片| 92国产精品观看| 无人码人妻一区二区三区免费| 久久九九99| 婷婷无套内射影院| 日韩大片免费观看| 国产网站在线| 欧美成人vps| 在线视频 中文字幕| 欧美色播在线播放| 久操免费在线视频| 国产精品家庭影院| 国产全是老熟女太爽了| 粉嫩一区二区三区性色av| 国产色视频在线播放| 久久夜色精品| 国内外成人激情视频| 亚洲一级影院| 亚洲精品天堂成人片av在线播放| 欧美亚洲国产精品久久| 麻豆久久久av免费| 精品国产一区二区三区不卡蜜臂| 亚洲影视中文字幕| 色综合视频一区二区三区44| 国产精品美女久久| 户外露出一区二区三区| 91产国在线观看动作片喷水| 国产极品人妖在线观看| 久久亚洲私人国产精品va| 在线观看完整版免费| 国产亚洲福利一区| 免费在线毛片| 亚洲片在线资源| 理论在线观看| 亚洲欧美中文在线视频| 免费国产在线观看| 亚洲欧美日韩精品久久奇米色影视| 免费a级片在线观看| 精品第一国产综合精品aⅴ| 性生交生活影碟片| 欧美草草影院在线视频| 亚洲精品国产suv一区| 欧美mv日韩mv| 黄色av免费观看| 欧美精品一区男女天堂| 人妻无码中文字幕| 亚洲精品小视频| 国产香蕉在线| 中文字幕日韩精品在线| 欧洲美女少妇精品| 久久精品国产亚洲一区二区| 在线中文免费视频| 久久久亚洲国产| 忘忧草在线日韩www影院| 欧美一级电影在线| 日韩制服诱惑| 91亚洲国产精品| 凹凸av导航大全精品| 久久精品二区| 国产一区日韩| 免费观看中文字幕| 亚洲黄网站黄| 黑森林福利视频导航| 美女网站视频久久| 成人免费播放视频| 91香蕉视频mp4| 99久久99久久精品免费| 亚洲乱码中文字幕综合| 国产午夜性春猛交ⅹxxx| 91成人网在线| www天堂在线| 日韩精品久久久久| 香蕉视频网站在线观看| 欧美第一淫aaasss性| 欧美黑人一区| 亚洲最大成人网色| 日本成人中文| 欧美 另类 交| 亚洲女同在线| 免费欧美一级片| 国产午夜精品久久| 激情视频在线播放| 一本到不卡免费一区二区| 国产精品久久久久久久成人午夜| 亚洲精品一区二区三区福利| 黄色影院在线播放| 欧美区二区三区| 欧美成人精品三级网站| 91成人在线看| 欧美精品一区二区三区中文字幕 | 国内成人在线| 免费在线观看的毛片| 国产经典欧美精品| 色婷婷在线影院| 一区二区三区四区精品在线视频| 日本久久综合网| 日韩女优av电影在线观看| 黄网在线观看| 久久人人爽人人爽人人片av高请| 日韩一区精品| 另类欧美小说| 欧美性色综合| 中文字幕永久视频| 99精品桃花视频在线观看| 91高清免费观看| 欧洲精品在线观看| 四虎在线观看| 久久久免费电影| 57pao成人永久免费| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 天天av天天操| 国产精品日韩成人| 日韩综合在线观看| 亚洲精品福利资源站| 性xxxxfjsxxxxx欧美| 国产欧美日韩中文字幕| 男男gay无套免费视频欧美| 成人在线观看你懂的| 国产一区二区三区香蕉| 久久噜噜色综合一区二区| 色婷婷综合久久久中文字幕| 无码国产精品高潮久久99| 欧美高清在线播放| 91精品一区| 最新欧美日韩亚洲| 九九久久精品视频 | 亚洲欧美日韩国产一区二区三区| 国产精品成人久久久| 精品偷拍一区二区三区在线看 | 亚洲a一区二区三区| 校园春色 亚洲色图| 国产视频一区二区三区在线观看| 麻豆精品久久久久久久99蜜桃| 亚洲精品久久久久中文字幕欢迎你| 免费在线看污片| 国产经品一区二区| 你懂的国产精品永久在线| 国产黄色一区二区三区| 亚洲日穴在线视频| www久久久久久| 高清视频欧美一级| 国产亚洲精品美女久久| av网站手机在线观看| 99精品视频免费在线观看| 日本三级视频在线| 亚洲精品久久在线| 毛片无码国产| 天堂一区二区三区| 精品一区精品二区高清| 亚洲女人久久久| 91精品国产麻豆国产自产在线| 黄色网址视频在线观看| 懂色中文一区二区三区在线视频| 激情久久综合| 中文字幕一区二区三区人妻| 色婷婷综合视频在线观看| 韩国精品视频| 91中文在线视频| 樱桃成人精品视频在线播放| 黄色短视频在线观看| 91福利视频在线| 激情在线小视频| 国产精品香蕉视屏| 久久动漫亚洲| 91高清免费看| 亚洲国产成人精品久久久国产成人一区 | 嫩草av久久伊人妇女超级a| 国产精品麻豆欧美日韩ww| 99国产精品久久久久久久成人 | 香蕉影院在线观看| 色偷偷av亚洲男人的天堂| 日韩精品视频中文字幕| 91免费视频网站在线观看| 日本一区二区不卡视频| a天堂在线视频| 91黄色8090| 日韩av二区| 中国极品少妇xxxx| 欧美亚洲尤物久久| 欧美草逼视频| 日韩视频在线观看国产| 国产精品一二三四五| 中日韩精品视频在线观看| 尤物yw午夜国产精品视频明星| 精品久久亚洲| 嫩草av久久伊人妇女超级a| 一区二区三区鲁丝不卡| 国产精品二线| 国产私拍一区| 久久电影网站中文字幕| 欧美亚韩一区二区三区| 另类视频在线观看| 日韩精品免费一区二区三区竹菊| 美女在线视频一区二区|