Java設(shè)計(jì)模式七大原則之開閉原則詳解
定義
開閉原則( Open Close Principle ),又稱為OCP原則,即一個軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。其中,對擴(kuò)展開放是針對提供方來說的,對修改關(guān)閉是針對調(diào)用方來說的。
案例
需求
購買東西的時候,根據(jù)支付類型的不同使用不同的方式進(jìn)行支付,當(dāng)類型為1時,使用微信支付;當(dāng)類型為2時,使用支付寶支付
方案一
定義支付類型
/** * 支付類型 * @author:liyajie * @createTime:2022/2/7 10:21 * @version:1.0 */ public class PayType { int type; }
定義微信支付類
/** * 微信支付類 * @author:liyajie * @createTime:2022/2/7 10:46 * @version:1.0 */ public class WxPay extends PayType{ WxPay(){ super.type = 1; } }
定義支付寶支付類
/** * 支付寶支付類 * @author:liyajie * @createTime:2022/2/7 10:46 * @version:1.0 */ public class ZfbPay extends PayType{ ZfbPay(){ super.type = 2; } }
定義支付操作類
/** * @desc: * @author:liyajie * @createTime:2022/2/7 10:41 * @version:1.0 */ public class Pay { public void pay(PayType s) { if (s.type == 1) { wxPay(s); } else if (s.type == 2) { zfbPay(s); } } // 微信支付 public void wxPay(PayType r) { System.out.println(" 正在微信支付中---支付成功 "); } // 支付寶支付 public void zfbPay(PayType r) { System.out.println(" 正在支付寶支付中---支付成功"); } }
定義測試類
/** * 測試類1 * @author:liyajie * @createTime:2022/2/7 10:48 * @version:1.0 */ public class Test1 { public static void main(String[] args) { new Pay().pay(new WxPay()); new Pay().pay(new ZfbPay()); } }
執(zhí)行結(jié)果
方案二
定義支付類型基類
/** * 支付類型基類 * @author:liyajie * @createTime:2022/2/7 10:21 * @version:1.0 */ public abstract class PayTypeNew { int type; public abstract void pay(); }
定義微信支付類
/** * 微信支付類 * @author:liyajie * @createTime:2022/2/7 10:46 * @version:1.0 */ public class WxPayNew extends PayTypeNew{ WxPayNew(){ super.type = 1; } @Override public void pay() { System.out.println(" 正在微信支付中---支付成功 "); } }
定義支付寶支付類
/** * 支付寶支付類 * @author:liyajie * @createTime:2022/2/7 10:46 * @version:1.0 */ public class ZfbPayNew extends PayTypeNew{ ZfbPayNew(){ super.type = 2; } @Override public void pay() { System.out.println(" 正在支付寶支付中---支付成功"); } }
定義支付操作類
/** * 支付操作類 * @author:liyajie * @createTime:2022/2/7 10:41 * @version:1.0 */ public class PayNew { public void pay(PayTypeNew payTypeNew) { payTypeNew.pay(); } }
定義測試類
/** * 測試類2 * @author:liyajie * @createTime:2022/2/7 10:48 * @version:1.0 */ public class Test2 { public static void main(String[] args) { new PayNew().pay(new WxPayNew()); new PayNew().pay(new ZfbPayNew()); } }
執(zhí)行結(jié)果
對比分析
方案一,未遵守開閉原則,耦合較高,如果需求需要擴(kuò)展,比如再增加一個信用卡支付,那么需要改的地方較大,風(fēng)險(xiǎn)較高
方案二,遵守開閉原則,耦合低,擴(kuò)展方便,并且也提高了代碼的復(fù)用性,維護(hù)起來也很方便
總結(jié)
開閉原則是最基礎(chǔ)最重要的設(shè)計(jì)原則,開閉原則可以提高復(fù)用性和可維護(hù)性
到此這篇關(guān)于Java設(shè)計(jì)模式七大原則之開閉原則詳解的文章就介紹到這了,更多相關(guān)Java開閉原則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Spock框架Mock對象的方法經(jīng)驗(yàn)總結(jié)
這篇文章主要分享了Spock框架Mock對象的方法經(jīng)驗(yàn)總結(jié),下文分享一些常用項(xiàng)目實(shí)戰(zhàn)說明以及代碼,供大家項(xiàng)目中參考,也具有一的的參考價值,需要的小伙伴可以參考一下2022-02-02基礎(chǔ)不牢,地動山搖,Java基礎(chǔ)速來刷刷
基礎(chǔ)不牢,地動山搖,快來一起學(xué)習(xí)一下基礎(chǔ)吧,不斷地學(xué)習(xí)就算是基礎(chǔ)也會有新的認(rèn)知和收獲,加油2021-08-08使用Spring自定義注解實(shí)現(xiàn)任務(wù)路由的方法
本篇文章主要介紹了使用Spring自定義注解實(shí)現(xiàn)任務(wù)路由的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-072020新版idea創(chuàng)建項(xiàng)目沒有javaEE 沒有Web選項(xiàng)的完美解決方法
這篇文章主要介紹了2020新版idea創(chuàng)建項(xiàng)目沒有javaEE 沒有Web選項(xiàng)的完美解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09深入理解Java中的volatile關(guān)鍵字(總結(jié)篇)
volatile這個關(guān)鍵字,不僅僅在Java語言中有,在很多語言中都有的,而且其用法和語義也都是不盡相同的。這篇文章主要介紹了Java中的volatile關(guān)鍵字,需要的朋友可以參考下2018-10-10一文帶你吃透JSP增刪改查實(shí)戰(zhàn)案例詳細(xì)解讀
這篇文章主要為大家詳細(xì)介紹了JSP中增刪改查實(shí)戰(zhàn)案例的相關(guān)知識,文中的示例代碼講解現(xiàn)象,具有一定的借鑒價值,感興趣的小伙伴可以了解一下2023-03-03Java實(shí)現(xiàn)短信驗(yàn)證碼詳細(xì)過程
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)短信驗(yàn)證碼的相關(guān)資料, 在業(yè)務(wù)需求中我們經(jīng)常會用到短信驗(yàn)證碼,比如手機(jī)號登錄、綁定手機(jī)號、忘記密碼、敏感操作等,需要的朋友可以參考下2023-09-09