溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

設(shè)計模式系列之什么是橋接模式

發(fā)布時間:2021-10-18 11:07:32 來源:億速云 閱讀:142 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“設(shè)計模式系列之什么是橋接模式”,在日常操作中,相信很多人在設(shè)計模式系列之什么是橋接模式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”設(shè)計模式系列之什么是橋接模式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、概述

橋接模式是一種結(jié)構(gòu)型設(shè)計模式, 可將一個大類或一系列緊密相關(guān)的類拆分為抽象和實現(xiàn)兩個獨立的層次結(jié)構(gòu), 從而能在開發(fā)時分別使用。

2、適用場景

1)如果你想要拆分或重組一個具有多重功能的龐雜類 , 可以使用橋接模式。2) 如果你希望在幾個獨立維度上擴展一個類,  可使用該模式。對象的屬性有其他類去實現(xiàn),不需要自己處理所有工作。3)如果你需要在運行時切換不同實現(xiàn)方法, 可使用橋接模式。橋接模式可替換抽象部分中的實現(xiàn)對象,  具體操作就和給成員變量賦新值一樣簡單。

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;  }

定義支付業(yè)務(wù)流程:

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("--------------------------------------");     }  }

結(jié)果:

當前支付方式是:掃臉 當前支付途徑是:支付寶 -------------------------------------- 當前支付方式是:掃臉 當前支付途徑是:微信 -------------------------------------- 當前支付方式是:指紋 當前支付途徑是:支付寶 -------------------------------------- 當前支付方式是:指紋 當前支付途徑是:微信 --------------------------------------

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("--------------------------------------");     }  }

結(jié)果:

當前支付方式是:支付寶 當前支付方式是:FACE -------------------------------------- 當前支付方式是:微信 當前支付方式是:FACE -------------------------------------- 當前支付方式是:支付寶 當前支付方式是:FINGER -------------------------------------- 當前支付方式是:微信 當前支付方式是:FINGER --------------------------------------

4、分析

如上兩種方式都實現(xiàn)了四種支付的過程,其中是以支付途徑(支付寶、微信)為主,包含兩種支付方式(掃臉、指紋)。

從代碼量分析:

不使用:代碼還是比較少的,但是其實主要業(yè)務(wù)邏輯要卸載Pay這個類中,通過if,else判斷進行業(yè)務(wù)邏輯的判斷。

使用:代碼量大量提升,增加了很多個類,但是pay的業(yè)務(wù)邏輯只會在自己的類中執(zhí)行,符合單一職責。

從可擴展層面,假如增加云閃付支付途徑:

不使用:需要修改Pay類,增加云閃付的邏輯判斷,不符合開閉原則。

使用:只需要增加一個云閃付支付途徑即可,不需要修改其他業(yè)務(wù)邏輯,符合開閉原則。

代碼耦合層面:

不使用:代碼業(yè)務(wù)邏輯耦合在一起。

使用的:代碼耦合性極低。

到此,關(guān)于“設(shè)計模式系列之什么是橋接模式”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI