依賴倒置原則:支付網(wǎng)關(guān)設(shè)計應(yīng)用案例

image.png

依賴倒置原則(Dependency Inversion Principle, DIP)是SOLID原則的一部分践叠,它提倡在設(shè)計時依賴于抽象(接口或抽象類),而不是具體的實現(xiàn)叨恨。這有助于降低模塊間的耦合度柳刮,提高系統(tǒng)的可擴展性和可維護(hù)性。

肖哥彈架構(gòu) 跟大家“彈彈” 代碼設(shè)計技巧痒钝,需要代碼關(guān)注

歡迎 點贊秉颗,點贊,點贊送矩。

關(guān)注公號Solomon肖哥彈架構(gòu)獲取更多精彩內(nèi)容

歷史熱點文章

2. 依賴倒置原則設(shè)計圖:

image.png

3. 依賴倒置原則解決什么:

依賴倒置原則解決了在支付網(wǎng)關(guān)設(shè)計中蚕甥,業(yè)務(wù)邏輯層與具體支付實現(xiàn)之間的緊密耦合問題。

4. 依賴倒置原則特點:

  • 抽象化依賴:高層模塊依賴于抽象接口栋荸,而不是具體的實現(xiàn)類菇怀。
  • 靈活性增強:可以靈活地替換或增加新的支付處理器凭舶,而不影響業(yè)務(wù)邏輯層。

5. 依賴倒置原則缺點:

  • 可能增加設(shè)計復(fù)雜性:需要更多的接口定義和實現(xiàn)類爱沟。
  • 性能考慮:間接層可能對性能有一定影響帅霜,尤其是在高性能要求的場景下。

6. 依賴倒置原則使用場景:

  • 當(dāng)系統(tǒng)需要支持多種支付方式呼伸,并且預(yù)期會引入更多支付方式或修改現(xiàn)有支付邏輯時义屏。
  • 在ERP系統(tǒng)中,當(dāng)需要從多個數(shù)據(jù)源生成報告蜂大,或預(yù)期報告生成方式將隨時間變化時闽铐。

7. 依賴倒置原則案例

7.1 支付網(wǎng)關(guān)案例

重構(gòu)前:

    public class PaymentGateway {
        public PaymentResponse processPayment(PaymentDetails details) {
            // 直接使用具體的支付處理器
            return new CreditCardProcessor().charge(details);
        }
    }

    class CreditCardProcessor {
        public PaymentResponse charge(PaymentDetails details) {
            // 處理信用卡支付邏輯
            return new PaymentResponse();
        }
    }

重構(gòu)后:

    interface IPaymentProcessor {
        PaymentResponse charge(PaymentDetails details);
    }

    class CreditCardProcessor implements IPaymentProcessor {
        public PaymentResponse charge(PaymentDetails details) {
            // 處理信用卡支付邏輯
            return new PaymentResponse();
        }
    }

    class PayPalProcessor implements IPaymentProcessor {
        public PaymentResponse charge(PaymentDetails details) {
            // 處理PayPal支付邏輯
            return new PaymentResponse();
        }
    }

    class PaymentGateway {
        private IPaymentProcessor paymentProcessor;

        public PaymentGateway(IPaymentProcessor paymentProcessor) {
            this.paymentProcessor = paymentProcessor;
        }

        public PaymentResponse processPayment(PaymentDetails details) {
            // 依賴于抽象的支付處理器接口
            return paymentProcessor.charge(details);
        }
    }

    // 使用PaymentGateway
    PaymentGateway gateway = new PaymentGateway(new CreditCardProcessor());
    PaymentResponse response = gateway.processPayment(new PaymentDetails());

7.1 ERP 案例

重構(gòu)前:

public class FinancialModule {
    public void generateReports() {
        // 直接依賴于具體的數(shù)據(jù)庫報告生成服務(wù)
        DatabaseReportingService service = new DatabaseReportingService();
        service.generate(...);
    }
}

class DatabaseReportingService {
    public void generate(/* parameters */) {
        // 從數(shù)據(jù)庫生成報告的邏輯
    }
}

問題分析:

  1. 緊耦合: FinancialModule 直接依賴于 DatabaseReportingService 的具體實現(xiàn),耦合度高奶浦,導(dǎo)致系統(tǒng)靈活性差兄墅。
  2. 擴展性差: 當(dāng)需要添加新的報告生成方式(例如基于文件的報告)時,可能需要修改 FinancialModule 的代碼澳叉,這違背了開閉原則隙咸。
  3. 維護(hù)困難: 如果 DatabaseReportingService 的接口或?qū)崿F(xiàn)發(fā)生變化,可能會影響到 FinancialModule成洗,增加了維護(hù)成本五督。
  4. 測試復(fù)雜性: 直接依賴具體實現(xiàn)使得單元測試 FinancialModule 變得復(fù)雜,可能需要大量模擬(mocking)具體類瓶殃。
  5. 代碼重復(fù): 如果系統(tǒng)中其他模塊也需要生成報告充包,可能會復(fù)制 FinancialModule 中的代碼,導(dǎo)致代碼重復(fù)遥椿。

重構(gòu)后:

interface ReportingService {
    void generate(ReportRequest request);
}

class DatabaseReportingService implements ReportingService {
    public void generate(ReportRequest request) {
        // 從數(shù)據(jù)庫生成報告的邏輯
    }
}

class FileBasedReportingService implements ReportingService {
    public void generate(ReportRequest request) {
        // 從文件生成報告的邏輯
    }
}

class FinancialModule {
    private ReportingService reportingService;

    public FinancialModule(ReportingService reportingService) {
        this.reportingService = reportingService;
    }

    public void generateReports(ReportRequest request) {
        // 使用抽象的報告服務(wù)生成報告
        reportingService.generate(request);
    }
}

// 使用FinancialModule
FinancialModule financialModule = new FinancialModule(new DatabaseReportingService());
financialModule.generateReports(new ReportRequest());

解決的問題:

  1. 解耦合: FinancialModule 現(xiàn)在依賴于 ReportingService 接口基矮,而不是任何具體實現(xiàn),降低了耦合度冠场。
  2. 擴展性增強: 新的報告生成方式(如 FileBasedReportingService)可以通過實現(xiàn) ReportingService 接口輕松添加家浇,無需修改 FinancialModule
  3. 維護(hù)簡化: 由于 FinancialModule 不依賴于具體實現(xiàn)碴裙,因此維護(hù)和升級報告生成服務(wù)時對 FinancialModule 的影響較小钢悲。
  4. 測試簡化: 可以輕松地為 FinancialModule 編寫單元測試,只需模擬 ReportingService 接口舔株,而不是具體實現(xiàn)莺琳。
  5. 代碼復(fù)用: 其他需要報告生成功能的模塊可以重用 FinancialModule,通過注入不同的 ReportingService 實現(xiàn)來滿足特定需求督笆。
  6. 依賴注入: 通過構(gòu)造函數(shù)或設(shè)置器注入 ReportingService 的實現(xiàn)芦昔,提高了 FinancialModule 的靈活性和可配置性。
  7. 單一職責(zé): FinancialModule 專注于其業(yè)務(wù)邏輯娃肿,而報告生成的具體細(xì)節(jié)由 ReportingService 的實現(xiàn)負(fù)責(zé)咕缎,符合單一職責(zé)原則珠十。

8. 參考開源框架:

在Apache Camel等集成框架中,通過使用自定義組件和處理器凭豪,遵循依賴倒置原則焙蹭,實現(xiàn)靈活的消息路由和處理。

9. 總結(jié):

依賴倒置原則在支付網(wǎng)關(guān)設(shè)計中的應(yīng)用嫂伞,通過引入抽象層孔厉,有效地解耦了業(yè)務(wù)邏輯與具體支付實現(xiàn)。這不僅提高了系統(tǒng)的靈活性和可擴展性帖努,也使得新增或修改支付方式變得更加簡單撰豺。遵循依賴倒置原則有助于構(gòu)建更加健壯、易于維護(hù)的系統(tǒng)拼余,尤其是在需要支持多種支付方式的電子商務(wù)平臺中污桦。

歷史熱點文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匙监,隨后出現(xiàn)的幾起案子凡橱,更是在濱河造成了極大的恐慌,老刑警劉巖亭姥,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稼钩,死亡現(xiàn)場離奇詭異,居然都是意外死亡达罗,警方通過查閱死者的電腦和手機坝撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氮块,“玉大人绍载,你說我怎么就攤上這事√喜酰” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵塔沃,是天一觀的道長蝠引。 經(jīng)常有香客問我,道長蛀柴,這世上最難降的妖魔是什么螃概? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鸽疾,結(jié)果婚禮上吊洼,老公的妹妹穿的比我還像新娘。我一直安慰自己制肮,他們只是感情好冒窍,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布递沪。 她就那樣靜靜地躺著,像睡著了一般综液。 火紅的嫁衣襯著肌膚如雪款慨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天谬莹,我揣著相機與錄音檩奠,去河邊找鬼。 笑死附帽,一個胖子當(dāng)著我的面吹牛埠戳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕉扮,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼乞而,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慢显?” 一聲冷哼從身側(cè)響起爪模,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荚藻,沒想到半個月后屋灌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡应狱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年共郭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾呻。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡除嘹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岸蜗,到底是詐尸還是另有隱情尉咕,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布璃岳,位于F島的核電站年缎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铃慷。R本人自食惡果不足惜单芜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望犁柜。 院中可真熱鬧洲鸠,春花似錦、人聲如沸馋缅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袜匿,卻和暖如春更啄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背居灯。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工祭务, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怪嫌。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓义锥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岩灭。 傳聞我的和親對象是個殘疾皇子拌倍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容