日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
設(shè)計(jì)模式系列之橋接模式

本文轉(zhuǎn)載自微信公眾號(hào)「狼王編程」,作者狼王。轉(zhuǎn)載本文請聯(lián)系狼王編程公眾號(hào)。 

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),天峨企業(yè)網(wǎng)站建設(shè),天峨品牌網(wǎng)站建設(shè),網(wǎng)站定制,天峨網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,天峨網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1、概述

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

2、適用場景

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

3、實(shí)例

有以下場景:

 
 
 
  1. 支付途徑:微信,支付寶 
  2. 支付方式:指紋,掃臉 

3.1 不使用橋接模式

定義兩個(gè)枚舉

 
 
 
  1. /** 
  2.  * 支付方式 
  3.  */ 
  4. public enum PayMethodEnum { 
  5.  
  6.     FACE(0, "掃臉"), 
  7.     FINGER(1, "指紋"); 
  8.  
  9.  
  10.     PayMethodEnum(int code, String name) { 
  11.         this.code = code; 
  12.         this.name = name; 
  13.     } 
  14.  
  15.     public int getCode() { 
  16.         return code; 
  17.     } 
  18.  
  19.     public void setCode(int code) { 
  20.         this.code = code; 
  21.     } 
  22.  
  23.     public String getName(int code) { 
  24.         PayMethodEnum[] payWaysEnums = values(); 
  25.         for (PayMethodEnum payMethodEnum : payWaysEnums) { 
  26.             if (payMethodEnum.code == code) { 
  27.                 return payMethodEnum.name; 
  28.             } 
  29.         } 
  30.         return null; 
  31.     } 
  32.  
  33.     public void setName(String name) { 
  34.         this.name = name; 
  35.     } 
  36.  
  37.     private int code; 
  38.  
  39.     private String name; 
  40.  
 
 
 
  1. /** 
  2.  * 支付途徑 
  3.  */ 
  4. public enum PayWaysEnum { 
  5.  
  6.     ZHIFUBAO(0, "支付寶"), 
  7.     WEIXIN(1, "微信"); 
  8.  
  9.  
  10.     PayWaysEnum(int code, String name) { 
  11.         this.code = code; 
  12.         this.name = name; 
  13.     } 
  14.  
  15.     public int getCode() { 
  16.         return code; 
  17.     } 
  18.  
  19.     public void setCode(int code) { 
  20.         this.code = code; 
  21.     } 
  22.  
  23.     private int code; 
  24.  
  25.  
  26.     public void setName(String name) { 
  27.         this.name = name; 
  28.     } 
  29.  
  30.     public String getName(int code) { 
  31.         PayWaysEnum[] payWaysEnums = values(); 
  32.         for (PayWaysEnum payWaysEnum : payWaysEnums) { 
  33.             if (payWaysEnum.code == code) { 
  34.                 return payWaysEnum.name; 
  35.             } 
  36.         } 
  37.         return null; 
  38.     } 
  39.  
  40.     private String name; 
  41.  

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

 
 
 
  1. public class Pay { 
  2.  
  3.     public void pay(int payMethod, int payWay) { 
  4.         if (PayMethodEnum.FACE.getCode() == payMethod) { 
  5.             System.out.println("當(dāng)前支付方式是:" + PayMethodEnum.FACE.getName(payMethod)); 
  6.         } else { 
  7.             System.out.println("當(dāng)前支付方式是:" + PayMethodEnum.FINGER.getName(payMethod)); 
  8.         } 
  9.         if (PayWaysEnum.ZHIFUBAO.getCode() == payWay) { 
  10.             System.out.println("當(dāng)前支付途徑是:" + PayWaysEnum.ZHIFUBAO.getName(payWay)); 
  11.         } else { 
  12.             System.out.println("當(dāng)前支付途徑是:" + PayWaysEnum.WEIXIN.getName(payWay)); 
  13.         } 
  14.     } 

測試類:

 
 
 
  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest(classes = TestApplication.class) 
  3. public class TestDemo { 
  4.  
  5.     @Test 
  6.     public void test() { 
  7.         Pay pay = new Pay(); 
  8.         //支付寶掃臉支付 
  9.         pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.ZHIFUBAO.getCode()); 
  10.         System.out.println("--------------------------------------"); 
  11.         //微信掃臉支付 
  12.         pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.WEIXIN.getCode()); 
  13.         System.out.println("--------------------------------------"); 
  14.         //支付寶指紋支付 
  15.         pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.ZHIFUBAO.getCode()); 
  16.         System.out.println("--------------------------------------"); 
  17.         //微信指紋支付 
  18.         pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.WEIXIN.getCode()); 
  19.         System.out.println("--------------------------------------"); 
  20.     } 
  21.  

結(jié)果:

 
 
 
  1. 當(dāng)前支付方式是:掃臉 
  2. 當(dāng)前支付途徑是:支付寶 
  3. -------------------------------------- 
  4. 當(dāng)前支付方式是:掃臉 
  5. 當(dāng)前支付途徑是:微信 
  6. -------------------------------------- 
  7. 當(dāng)前支付方式是:指紋 
  8. 當(dāng)前支付途徑是:支付寶 
  9. -------------------------------------- 
  10. 當(dāng)前支付方式是:指紋 
  11. 當(dāng)前支付途徑是:微信 
  12. -------------------------------------- 

3.2 使用橋接模式

定義枚舉:

 
 
 
  1. /** 
  2.  * 支付方式 
  3.  */ 
  4. public enum PayMethodEnum { 
  5.  
  6.     FACE(0, "掃臉"), 
  7.     FINGER(1, "指紋"); 
  8.  
  9.  
  10.     PayMethodEnum(int code, String name) { 
  11.         this.code = code; 
  12.         this.name = name; 
  13.     } 
  14.  
  15.     public int getCode() { 
  16.         return code; 
  17.     } 
  18.  
  19.     public void setCode(int code) { 
  20.         this.code = code; 
  21.     } 
  22.  
  23.     public String getName() { 
  24.         return name; 
  25.     } 
  26.  
  27.     public void setName(String name) { 
  28.         this.name = name; 
  29.     } 
  30.  
  31.     private int code; 
  32.  
  33.     private String name; 
  34.  
 
 
 
  1. /** 
  2.  * 支付途徑 
  3.  */ 
  4. public enum PayWaysEnum { 
  5.  
  6.     ZHIFUBAO(0, "支付寶"), 
  7.     WEIXIN(1, "微信"); 
  8.  
  9.  
  10.     PayWaysEnum(int code, String name) { 
  11.         this.code = code; 
  12.         this.name = name; 
  13.     } 
  14.  
  15.     public int getCode() { 
  16.         return code; 
  17.     } 
  18.  
  19.     public void setCode(int code) { 
  20.         this.code = code; 
  21.     } 
  22.  
  23.     private int code; 
  24.  
  25.  
  26.     public void setName(String name) { 
  27.         this.name = name; 
  28.     } 
  29.  
  30.     public String getName() { 
  31.         return name; 
  32.     } 
  33.  
  34.     private String name; 
  35.  

定義兩個(gè)頂層抽象接口:

 
 
 
  1. /** 
  2.  * 支付方式接口 
  3.  */ 
  4. public interface IPayMethod { 
  5.  
  6.     void pay(); 
 
 
 
  1. /** 
  2.  * 支付途徑接口 
  3.  */ 
  4. public interface IPayWay { 
  5.  
  6.     void pay(); 

定義兩種支付方式:

 
 
 
  1. /** 
  2.  * 指紋 
  3.  */ 
  4. public class FingerPay implements IPayMethod { 
  5.  
  6.     @Override 
  7.     public void pay() { 
  8.         System.out.println("當(dāng)前支付方式是:" + PayMethodEnum.FINGER.name()); 
  9.     } 
 
 
 
  1. /** 
  2.  * 掃臉 
  3.  */ 
  4. public class FacePay implements IPayMethod { 
  5.  
  6.     @Override 
  7.     public void pay() { 
  8.         System.out.println("當(dāng)前支付方式是:" + PayMethodEnum.FACE.name()); 
  9.     } 

定義兩種支付途徑:

 
 
 
  1. /** 
  2.  * 微信 
  3.  */ 
  4. public class WXPayWay implements IPayWay { 
  5.  
  6.     private IPayMethod payMethod; 
  7.  
  8.     public WXPayWay(IPayMethod payMethod) { 
  9.         this.payMethod = payMethod; 
  10.     } 
  11.  
  12.     @Override 
  13.     public void pay() { 
  14.         System.out.println("當(dāng)前支付方式是:" + PayWaysEnum.WEIXIN.getName()); 
  15.         payMethod.pay(); 
  16.     } 
 
 
 
  1. /** 
  2.  * 支付寶 
  3.  */ 
  4. public class ZFBPayWay implements IPayWay { 
  5.  
  6.     private IPayMethod payMethod; 
  7.  
  8.     public ZFBPayWay(IPayMethod payMethod) { 
  9.         this.payMethod = payMethod; 
  10.     } 
  11.  
  12.     @Override 
  13.     public void pay() { 
  14.         System.out.println("當(dāng)前支付方式是:" + PayWaysEnum.ZHIFUBAO.getName()); 
  15.         payMethod.pay(); 
  16.     } 

測試類:

 
 
 
  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest(classes = TestApplication.class) 
  3. public class TestDemo { 
  4.  
  5.     @Test 
  6.     public void test() { 
  7.         FacePay facePay = new FacePay(); 
  8.         FingerPay fingerPay = new FingerPay(); 
  9.         ZFBPayWay zfbPayFace = new ZFBPayWay(facePay); 
  10.         WXPayWay wxPayWayFace = new WXPayWay(facePay); 
  11.         ZFBPayWay zfbPayFinger = new ZFBPayWay(fingerPay); 
  12.         WXPayWay wxPayWayFinger = new WXPayWay(fingerPay); 
  13.         //支付寶掃臉支付 
  14.         zfbPayFace.pay(); 
  15.         System.out.println("--------------------------------------"); 
  16.         //微信掃臉支付 
  17.         wxPayWayFace.pay(); 
  18.         System.out.println("--------------------------------------"); 
  19.         //支付寶指紋支付 
  20.         zfbPayFinger.pay(); 
  21.         System.out.println("--------------------------------------"); 
  22.         //微信指紋支付 
  23.         wxPayWayFinger.pay(); 
  24.         System.out.println("--------------------------------------"); 
  25.     } 
  26.  

結(jié)果:

 
 
 
  1. 當(dāng)前支付方式是:支付寶 
  2. 當(dāng)前支付方式是:FACE 
  3. -------------------------------------- 
  4. 當(dāng)前支付方式是:微信 
  5. 當(dāng)前支付方式是:FACE 
  6. -------------------------------------- 
  7. 當(dāng)前支付方式是:支付寶 
  8. 當(dāng)前支付方式是:FINGER 
  9. -------------------------------------- 
  10. 當(dāng)前支付方式是:微信 
  11. 當(dāng)前支付方式是:FINGER 
  12. -------------------------------------- 

4、分析

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

從代碼量分析:

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

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

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

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

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

代碼耦合層面:

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

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

5、總結(jié)

優(yōu)點(diǎn):1)客戶端僅僅與高層抽象進(jìn)行互動(dòng),不關(guān)系內(nèi)部對象。2)符合單一原則。3)符合開閉原則。

缺點(diǎn):在業(yè)務(wù)對象很多,能抽象很多的業(yè)務(wù)邏輯而言,會(huì)大量的增加類的數(shù)量,導(dǎo)致代碼的復(fù)雜性。


網(wǎng)頁題目:設(shè)計(jì)模式系列之橋接模式
文章源于:http://m.5511xx.com/article/dpcphph.html