您好,登錄后才能下訂單哦!
這篇文章主要介紹“設計模式系列之什么是橋接模式”,在日常操作中,相信很多人在設計模式系列之什么是橋接模式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”設計模式系列之什么是橋接模式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1、概述
橋接模式是一種結構型設計模式, 可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構, 從而能在開發時分別使用。
2、適用場景
1)如果你想要拆分或重組一個具有多重功能的龐雜類 , 可以使用橋接模式。2) 如果你希望在幾個獨立維度上擴展一個類, 可使用該模式。對象的屬性有其他類去實現,不需要自己處理所有工作。3)如果你需要在運行時切換不同實現方法, 可使用橋接模式。橋接模式可替換抽象部分中的實現對象, 具體操作就和給成員變量賦新值一樣簡單。
3、實例
有以下場景:
支付途徑:微信,支付寶 支付方式:指紋,掃臉
3.1 不使用橋接模式
定義兩個枚舉
/** * 支付方式 */ public enum PayMethodEnum { FACE(0, "掃臉"), FINGER(1, "指紋"); PayMethodEnum(int code, String name) { this.code = code; this.name = name; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName(int code) { PayMethodEnum[] payWaysEnums = values(); for (PayMethodEnum payMethodEnum : payWaysEnums) { if (payMethodEnum.code == code) { return payMethodEnum.name; } } return null; } public void setName(String name) { this.name = name; } private int code; private String name; }
/** * 支付途徑 */ public enum PayWaysEnum { ZHIFUBAO(0, "支付寶"), WEIXIN(1, "微信"); PayWaysEnum(int code, String name) { this.code = code; this.name = name; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } private int code; public void setName(String name) { this.name = name; } public String getName(int code) { PayWaysEnum[] payWaysEnums = values(); for (PayWaysEnum payWaysEnum : payWaysEnums) { if (payWaysEnum.code == code) { return payWaysEnum.name; } } return null; } private String name; }
定義支付業務流程:
public class Pay { public void pay(int payMethod, int payWay) { if (PayMethodEnum.FACE.getCode() == payMethod) { System.out.println("當前支付方式是:" + PayMethodEnum.FACE.getName(payMethod)); } else { System.out.println("當前支付方式是:" + PayMethodEnum.FINGER.getName(payMethod)); } if (PayWaysEnum.ZHIFUBAO.getCode() == payWay) { System.out.println("當前支付途徑是:" + PayWaysEnum.ZHIFUBAO.getName(payWay)); } else { System.out.println("當前支付途徑是:" + PayWaysEnum.WEIXIN.getName(payWay)); } } }
測試類:
@RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class) public class TestDemo { @Test public void test() { Pay pay = new Pay(); //支付寶掃臉支付 pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.ZHIFUBAO.getCode()); System.out.println("--------------------------------------"); //微信掃臉支付 pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.WEIXIN.getCode()); System.out.println("--------------------------------------"); //支付寶指紋支付 pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.ZHIFUBAO.getCode()); System.out.println("--------------------------------------"); //微信指紋支付 pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.WEIXIN.getCode()); System.out.println("--------------------------------------"); } }
結果:
當前支付方式是:掃臉 當前支付途徑是:支付寶 -------------------------------------- 當前支付方式是:掃臉 當前支付途徑是:微信 -------------------------------------- 當前支付方式是:指紋 當前支付途徑是:支付寶 -------------------------------------- 當前支付方式是:指紋 當前支付途徑是:微信 --------------------------------------
3.2 使用橋接模式
定義枚舉:
/** * 支付方式 */ public enum PayMethodEnum { FACE(0, "掃臉"), FINGER(1, "指紋"); PayMethodEnum(int code, String name) { this.code = code; this.name = name; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } private int code; private String name; }
/** * 支付途徑 */ public enum PayWaysEnum { ZHIFUBAO(0, "支付寶"), WEIXIN(1, "微信"); PayWaysEnum(int code, String name) { this.code = code; this.name = name; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } private int code; public void setName(String name) { this.name = name; } public String getName() { return name; } private String name; }
定義兩個頂層抽象接口:
/** * 支付方式接口 */ public interface IPayMethod { void pay(); }
/** * 支付途徑接口 */ public interface IPayWay { void pay(); }
定義兩種支付方式:
/** * 指紋 */ public class FingerPay implements IPayMethod { @Override public void pay() { System.out.println("當前支付方式是:" + PayMethodEnum.FINGER.name()); } }
/** * 掃臉 */ public class FacePay implements IPayMethod { @Override public void pay() { System.out.println("當前支付方式是:" + PayMethodEnum.FACE.name()); } }
定義兩種支付途徑:
/** * 微信 */ public class WXPayWay implements IPayWay { private IPayMethod payMethod; public WXPayWay(IPayMethod payMethod) { this.payMethod = payMethod; } @Override public void pay() { System.out.println("當前支付方式是:" + PayWaysEnum.WEIXIN.getName()); payMethod.pay(); } }
/** * 支付寶 */ public class ZFBPayWay implements IPayWay { private IPayMethod payMethod; public ZFBPayWay(IPayMethod payMethod) { this.payMethod = payMethod; } @Override public void pay() { System.out.println("當前支付方式是:" + PayWaysEnum.ZHIFUBAO.getName()); payMethod.pay(); } }
測試類:
@RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class) public class TestDemo { @Test public void test() { FacePay facePay = new FacePay(); FingerPay fingerPay = new FingerPay(); ZFBPayWay zfbPayFace = new ZFBPayWay(facePay); WXPayWay wxPayWayFace = new WXPayWay(facePay); ZFBPayWay zfbPayFinger = new ZFBPayWay(fingerPay); WXPayWay wxPayWayFinger = new WXPayWay(fingerPay); //支付寶掃臉支付 zfbPayFace.pay(); System.out.println("--------------------------------------"); //微信掃臉支付 wxPayWayFace.pay(); System.out.println("--------------------------------------"); //支付寶指紋支付 zfbPayFinger.pay(); System.out.println("--------------------------------------"); //微信指紋支付 wxPayWayFinger.pay(); System.out.println("--------------------------------------"); } }
結果:
當前支付方式是:支付寶 當前支付方式是:FACE -------------------------------------- 當前支付方式是:微信 當前支付方式是:FACE -------------------------------------- 當前支付方式是:支付寶 當前支付方式是:FINGER -------------------------------------- 當前支付方式是:微信 當前支付方式是:FINGER --------------------------------------
4、分析
如上兩種方式都實現了四種支付的過程,其中是以支付途徑(支付寶、微信)為主,包含兩種支付方式(掃臉、指紋)。
從代碼量分析:
不使用:代碼還是比較少的,但是其實主要業務邏輯要卸載Pay這個類中,通過if,else判斷進行業務邏輯的判斷。
使用:代碼量大量提升,增加了很多個類,但是pay的業務邏輯只會在自己的類中執行,符合單一職責。
從可擴展層面,假如增加云閃付支付途徑:
不使用:需要修改Pay類,增加云閃付的邏輯判斷,不符合開閉原則。
使用:只需要增加一個云閃付支付途徑即可,不需要修改其他業務邏輯,符合開閉原則。
代碼耦合層面:
不使用:代碼業務邏輯耦合在一起。
使用的:代碼耦合性極低。
到此,關于“設計模式系列之什么是橋接模式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。