文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

设计模式系列之什么是桥接模式

2024-04-02 19:55

关注

这篇文章主要介绍“设计模式系列之什么是桥接模式”,在日常操作中,相信很多人在设计模式系列之什么是桥接模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”设计模式系列之什么是桥接模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、概述

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

2、适用场景

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

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

定义支付业务流程:

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

结果:

当前支付方式是:扫脸 当前支付途径是:支付宝 -------------------------------------- 当前支付方式是:扫脸 当前支付途径是:微信 -------------------------------------- 当前支付方式是:指纹 当前支付途径是:支付宝 -------------------------------------- 当前支付方式是:指纹 当前支付途径是:微信 --------------------------------------

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

结果:

当前支付方式是:支付宝 当前支付方式是:FACE -------------------------------------- 当前支付方式是:微信 当前支付方式是:FACE -------------------------------------- 当前支付方式是:支付宝 当前支付方式是:FINGER -------------------------------------- 当前支付方式是:微信 当前支付方式是:FINGER --------------------------------------

4、分析

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

从代码量分析:

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

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

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

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

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

代码耦合层面:

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

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

到此,关于“设计模式系列之什么是桥接模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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