国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

[[385380]]

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

1、概述

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

2、適用場景

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

3、實例

有以下場景:

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

3.1 不使用橋接模式

定義兩個枚舉

  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.  

定義兩個頂層抽象接口:

  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、分析

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

從代碼量分析:

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

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

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

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

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

代碼耦合層面:

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

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

5、總結(jié)

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

 

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

 

責(zé)任編輯:武曉燕 來源: 狼王編程
相關(guān)推薦

2020-10-28 11:56:47

橋接模式

2022-01-14 09:22:22

設(shè)計模式橋接

2015-11-12 09:32:03

Javascript設(shè)計模式

2012-01-13 15:59:07

2021-06-09 08:53:34

設(shè)計模式策略模式工廠模式

2021-06-22 15:27:13

設(shè)計模式迭代器模式Java

2021-01-21 05:34:14

設(shè)計模式建造者

2024-04-12 12:10:18

Python設(shè)計模式開發(fā)

2020-05-25 10:20:19

享元模式場景

2021-02-18 08:39:28

設(shè)計模式場景

2021-07-08 11:28:43

觀察者模式設(shè)計

2022-05-11 08:17:15

Java字符串API

2020-11-03 13:05:18

命令模式

2020-11-04 08:54:54

狀態(tài)模式

2020-10-23 09:40:26

設(shè)計模式

2022-01-12 13:33:25

工廠模式設(shè)計

2010-03-19 11:07:57

點對點無線橋接模式

2020-10-20 13:33:00

建造者模式

2020-11-05 09:38:07

中介者模式

2020-11-09 08:20:33

解釋器模式
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲三级久久久| 欧美私人啪啪vps| 国产超碰在线观看| 国产成人在线视频| 国产日本欧洲亚洲| 久久在线视频免费观看| 香蕉视频在线播放| 日韩精品一区二区在线视频 | 国产精品伦理久久久久久| 自拍视频在线网| 亚洲熟妇无码一区二区三区| 国产ts一区二区| 日韩久久久精品| 国产日韩精品一区二区浪潮av| 在线观看国产精品入口| 唐人社导航福利精品| 国产对白在线| 久久久神马电影| 欧美超级免费视 在线| 大桥未久av一区二区三区| 国产黄色91视频| 日韩中文字幕高清在线观看| 国产ktv在线视频| 一级片a一级片| 热re99久久精品国99热蜜月| 久久青草福利网站| 欧美一级在线免费| 亚洲丝袜另类动漫二区| 日本一不卡视频| 嫩草影视亚洲| 伊人久久精品一区二区三区| 中文字幕电影在线| 91专区在线观看| 久久草.com| 欧美在线视频一区| 亚洲免费伊人电影在线观看av| 午夜亚洲福利老司机| 成人精品gif动图一区| 欧美视频一区| 日韩av黄色在线| 欧美一区久久久| www.av在线| 国产视频一二三| 人人干视频在线| 九色视频成人porny| 欧美专区在线观看| 中文字幕亚洲一区二区三区五十路| 欧美色综合影院| 亚洲女爱视频在线| 99免费精品在线观看| 久久精品人人| 99久久久久国产精品| 一区二区三区在线免费看| 国产高清自产拍av在线| 国产小视频在线| а√最新版在线天堂| 黄色一级片在线看| 日韩精品第一页| 亚洲一区二区三区sesese| 97国产成人精品视频| 伊人久久久久久久久久| 欧美一区二区三区视频在线观看| 亚瑟在线精品视频| 中文字幕欧美激情| av一区二区三区四区| 麻豆精品一区二区综合av| 在线欧美亚洲| 精品一区电影| 欧美理论电影在线精品| 亚洲综合在线电影| av在线资源| 麻豆av在线导航| 欧美精品少妇| 国产呻吟对白刺激无套视频在线| 99视频精品免费| 久久av综合网| 中文字幕在线观看一区二区三区| 国产一区二区无遮挡| 91精品国产综合久久男男| 91高清视频在线免费观看| 久久精品国产亚洲| 中文字幕在线看视频国产欧美| 亚洲国产精彩中文乱码av| 91精品国产综合久久久蜜臀粉嫩 | 欧美一级大片在线视频| 成人性生活视频| 欧洲精品二区| 毛片激情在线观看| 成人在线观看网站| 欧美日韩影视| 亚洲精品套图| av成人动漫| 伊人资源视频在线| 国产三级国产精品国产专区50| 免费高清在线观看免费| 免费在线精品视频| 欧洲亚洲一区二区| 久草资源站在线观看| www.九色在线| 欧美精品播放| 色先锋资源久久综合| 91影视免费在线观看| 2024国产精品| 成人激情综合网站| 成人综合婷婷国产精品久久 | 亚洲第一精品在线| 亚洲男人天堂一区| 亚洲男帅同性gay1069| 亚洲一区二区偷拍精品| 亚洲成人av资源| 精品久久久久久国产| 黑人欧美xxxx| 在线影视一区二区三区| 欧美色大人视频| 69成人精品免费视频| 欧美成人激情免费网| 日韩免费看网站| 日韩高清免费在线| 国产一区二区三区在线观看视频 | 九九久久九九久久| 国产尤物av一区二区三区| 人人干视频在线| 蜜臀久久99精品久久久酒店新书| 午夜激情av在线| 国产在线传媒| 福利视频在线播放| 日本在线视频www鲁啊鲁| 一区二区三区电影大全| 亚洲国产综合在线观看| 福利片在线一区二区| 国产成人手机高清在线观看网站| 久久高清免费| 亚洲一区二区网站| 国产福利一区二区三区视频在线| 久久综合九色综合97婷婷女人| 91精品国产自产拍在线观看蜜 | 国产亚洲综合在线| 91美女视频在线| 在线免费观看污| 欧美××××黑人××性爽 | 亚洲国产一二三精品无码| 国产精品视频二| 99免费视频观看| 在线天堂av| 男女免费观看在线爽爽爽视频| 国外成人福利视频| 精品国产一区一区二区三亚瑟| 在线欧美三区| 国产91丝袜在线18| 亚洲精品乱码久久久久久| 欧美性感一类影片在线播放| 亚洲黄一区二区| 欧美国产日韩一区二区| 91久久久久久久一区二区| 日本亚洲欧洲精品| 国产精品秘入口18禁麻豆免会员| 黄页免费在线观看| 日韩另类在线| 北条麻妃一区二区三区在线| 亚洲欧美一级二级三级| 国产精品主播直播| 一区二区三区四区不卡视频 | 国产一区二区三区在线观看免费视频| 99九九99九九九视频精品| 亚洲成人福利片| 日韩不卡在线观看| 55夜色66夜色国产精品视频| 精品九九九九| 一本久道综合色婷婷五月| 国产二区在线播放| 高清久久一区| 日韩午夜免费| 国产亚洲欧美色| 欧美片在线播放| 精品中文字幕视频| 国产一区在线免费| 欧美激情精品久久久久久小说| 成在在线免费视频| 精品久久亚洲| 中文字幕一区二区三区久久网站| 视频一区免费观看| 久久电影网站中文字幕| 亚洲一区二区三区乱码| 大片网站久久| 久久视频在线免费观看| 亚洲男同gay网站| 精品久久久久99| 国产乱子伦三级在线播放| 亚洲免费大片在线观看| 亚洲精品不卡在线观看| 粉嫩av一区二区三区粉嫩| 欧美亚洲日本在线观看| 亚洲国产中文字幕| 日本三级视频在线播放| 欧美大片在线免费观看| 日本中文一区二区三区| 日本韩国一区| 日本三级久久久| av在线不卡观看免费观看| av网站在线看|