文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

设计模式系列之桥接模式

2024-12-03 09:53

关注

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

1、概述

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

2、适用场景

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

3、实例

有以下场景:

  1. 支付途径:微信,支付宝 
  2. 支付方式:指纹,扫脸 

3.1 不使用桥接模式

定义两个枚举

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

定义支付业务流程:

  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. public enum PayMethodEnum { 
  3.  
  4.     FACE(0, "扫脸"), 
  5.     FINGER(1, "指纹"); 
  6.  
  7.  
  8.     PayMethodEnum(int code, String name) { 
  9.         this.code = code; 
  10.         this.name = name
  11.     } 
  12.  
  13.     public int getCode() { 
  14.         return code; 
  15.     } 
  16.  
  17.     public void setCode(int code) { 
  18.         this.code = code; 
  19.     } 
  20.  
  21.     public String getName() { 
  22.         return name
  23.     } 
  24.  
  25.     public void setName(String name) { 
  26.         this.name = name
  27.     } 
  28.  
  29.     private int code; 
  30.  
  31.     private String name
  32.  
  1.  
  2. public enum PayWaysEnum { 
  3.  
  4.     ZHIFUBAO(0, "支付宝"), 
  5.     WEIXIN(1, "微信"); 
  6.  
  7.  
  8.     PayWaysEnum(int code, String name) { 
  9.         this.code = code; 
  10.         this.name = name
  11.     } 
  12.  
  13.     public int getCode() { 
  14.         return code; 
  15.     } 
  16.  
  17.     public void setCode(int code) { 
  18.         this.code = code; 
  19.     } 
  20.  
  21.     private int code; 
  22.  
  23.  
  24.     public void setName(String name) { 
  25.         this.name = name
  26.     } 
  27.  
  28.     public String getName() { 
  29.         return name
  30.     } 
  31.  
  32.     private String name
  33.  

定义两个顶层抽象接口:

  1.  
  2. public interface IPayMethod { 
  3.  
  4.     void pay(); 
  1.  
  2. public interface IPayWay { 
  3.  
  4.     void pay(); 

定义两种支付方式:

  1.  
  2. public class FingerPay implements IPayMethod { 
  3.  
  4.     @Override 
  5.     public void pay() { 
  6.         System.out.println("当前支付方式是:" + PayMethodEnum.FINGER.name()); 
  7.     } 
  1.  
  2. public class FacePay implements IPayMethod { 
  3.  
  4.     @Override 
  5.     public void pay() { 
  6.         System.out.println("当前支付方式是:" + PayMethodEnum.FACE.name()); 
  7.     } 

定义两种支付途径:

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

测试类:

  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)符合开闭原则。

 

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

 

来源:狼王编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯