设计模式系列之桥接模式

本文转载自微信公众号「狼王编程」,作者狼王。转载本文请联系狼王编程公众号。 

成都创新互联公司是一家集网站建设,天峨企业网站建设,天峨品牌网站建设,网站定制,天峨网站建设报价,网络营销,网络优化,天峨网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

1、概述

桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

2、适用场景

1)如果你想要拆分或重组一个具有多重功能的庞杂类 , 可以使用桥接模式。2) 如果你希望在几个独立维度上扩展一个类, 可使用该模式。对象的属性有其他类去实现,不需要自己处理所有工作。3)如果你需要在运行时切换不同实现方法, 可使用桥接模式。桥接模式可替换抽象部分中的实现对象, 具体操作就和给成员变量赋新值一样简单。

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.  

定义支付业务流程:

 
 
 
  1. public class Pay { 
  2.  
  3.     public void pay(int payMethod, int payWay) { 
  4.         if (PayMethodEnum.FACE.getCode() == payMethod) { 
  5.             System.out.println("当前支付方式是:" + PayMethodEnum.FACE.getName(payMethod)); 
  6.         } else { 
  7.             System.out.println("当前支付方式是:" + PayMethodEnum.FINGER.getName(payMethod)); 
  8.         } 
  9.         if (PayWaysEnum.ZHIFUBAO.getCode() == payWay) { 
  10.             System.out.println("当前支付途径是:" + PayWaysEnum.ZHIFUBAO.getName(payWay)); 
  11.         } else { 
  12.             System.out.println("当前支付途径是:" + 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.  

结果:

 
 
 
  1. 当前支付方式是:扫脸 
  2. 当前支付途径是:支付宝 
  3. -------------------------------------- 
  4. 当前支付方式是:扫脸 
  5. 当前支付途径是:微信 
  6. -------------------------------------- 
  7. 当前支付方式是:指纹 
  8. 当前支付途径是:支付宝 
  9. -------------------------------------- 
  10. 当前支付方式是:指纹 
  11. 当前支付途径是:微信 
  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("当前支付方式是:" + PayMethodEnum.FINGER.name()); 
  9.     } 
 
 
 
  1. /** 
  2.  * 扫脸 
  3.  */ 
  4. public class FacePay implements IPayMethod { 
  5.  
  6.     @Override 
  7.     public void pay() { 
  8.         System.out.println("当前支付方式是:" + 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("当前支付方式是:" + 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("当前支付方式是:" + 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.  

结果:

 
 
 
  1. 当前支付方式是:支付宝 
  2. 当前支付方式是:FACE 
  3. -------------------------------------- 
  4. 当前支付方式是:微信 
  5. 当前支付方式是:FACE 
  6. -------------------------------------- 
  7. 当前支付方式是:支付宝 
  8. 当前支付方式是:FINGER 
  9. -------------------------------------- 
  10. 当前支付方式是:微信 
  11. 当前支付方式是:FINGER 
  12. -------------------------------------- 

4、分析

如上两种方式都实现了四种支付的过程,其中是以支付途径(支付宝、微信)为主,包含两种支付方式(扫脸、指纹)。

从代码量分析:

不使用:代码还是比较少的,但是其实主要业务逻辑要卸载Pay这个类中,通过if,else判断进行业务逻辑的判断。

使用:代码量大量提升,增加了很多个类,但是pay的业务逻辑只会在自己的类中执行,符合单一职责。

从可扩展层面,假如增加云闪付支付途径:

不使用:需要修改Pay类,增加云闪付的逻辑判断,不符合开闭原则。

使用:只需要增加一个云闪付支付途径即可,不需要修改其他业务逻辑,符合开闭原则。

代码耦合层面:

不使用:代码业务逻辑耦合在一起。

使用的:代码耦合性极低。

5、总结

优点:1)客户端仅仅与高层抽象进行互动,不关系内部对象。2)符合单一原则。3)符合开闭原则。

缺点:在业务对象很多,能抽象很多的业务逻辑而言,会大量的增加类的数量,导致代码的复杂性。

网站标题:设计模式系列之桥接模式
文章起源:http://www.shufengxianlan.com/qtweb/news8/225958.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联