当前位置:   article > 正文

设计模式-桥接模式_微信支付宝等方式支付属于什么设计模式

微信支付宝等方式支付属于什么设计模式

前言

结构型设计模式

结构型模式主要总结了一些类和对象组合在一起的经典结构,这些经典结构可以解决对应特定场景的问题.

一共包括七种:代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。

桥接模式

概念

桥接模式(bridge pattern) 的定义是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展,有效的控制了系统中类的个数 (避免了继承层次的指数级爆炸).

桥接(Bridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :主要负责定义出该角色的行为 ,并包含一个对实现化对象的引用。

  • 扩展抽象化(RefinedAbstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。

  • 实现化(Implementor)角色 :定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用。

  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

桥接模式原理的核心是: 首先有要识别出一个类所具有的的两个独立变化维度,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合.总结一句话就是: 抽象角色引用实现角色

示例

支付操作

不使用桥接模式时

  1. public class PayController {
  2. /**
  3. * @param uId 用户id
  4. * @param tradeId 交易流水号
  5. * @param amount 交易金额
  6. * @param channelType 渠道类型 1 微信, 2 支付宝
  7. * @param modeType 支付模式 1 密码,2 人脸,3 指纹
  8. * @return: boolean
  9. */
  10. public boolean doPay(String uId, String tradeId, BigDecimal amount,int channelType,int modeType){
  11. //微信支付
  12. if(1 == channelType){
  13. System.out.println("微信渠道支付划账开始......");
  14. if(1 == modeType){
  15. System.out.println("密码支付");
  16. }if(2 == modeType){
  17. System.out.println("人脸支付");
  18. }if(3 == modeType){
  19. System.out.println("指纹支付");
  20. }
  21. }
  22. //支付宝支付
  23. if(2 == channelType){
  24. System.out.println("支付宝渠道支付划账开始......");
  25. if(1 == modeType){
  26. System.out.println("密码支付");
  27. }if(2 == modeType){
  28. System.out.println("人脸支付");
  29. }if(3 == modeType){
  30. System.out.println("指纹支付");
  31. }
  32. }
  33. return true;
  34. }
  35. }

如果后期需要添加或删除支付方式、支付渠道,则需要改动代码,后期维护和扩展将会变得非常复杂

通过桥接模式

重构

提取两个独立维度:支付方式和支付渠道

  • Pay抽象类

  • 支付渠道子类: 微信支付

  • 支付渠道子类: 支付宝支付

  • IPayMode接口

  • 支付模式实现: 刷脸支付

  • 支付模式实现: 指纹支付

  • 支付渠道*支付模式 = 相对应的组合.

代码

支付模式接口

  1. /**
  2. * 支付模式接口
  3. **/
  4. public interface IPayMode {
  5. //安全校验功能: 对各种支付模式进行风控校验
  6. boolean security(String uId);
  7. }

支付模式实现

实现支付模式接口,实现具体支付模式

  1. //指纹支付及风控校验
  2. public class PayFingerprintMode implements IPayMode {
  3. @Override
  4. public boolean security(String uId) {
  5. System.out.println("指纹支付,风控校验-指纹信息");
  6. return true;
  7. }
  8. }
  9. //刷脸支付及风控校验
  10. public class PayFaceMode implements IPayMode {
  11. @Override
  12. public boolean security(String uId) {
  13. System.out.println("人脸支付,风控校验-脸部识别");
  14. return true;
  15. }
  16. }
  17. //密码支付及风控校验
  18. public class PayCypher implements IPayMode {
  19. @Override
  20. public boolean security(String uId) {
  21. System.out.println("密码支付,风控校验-环境安全");
  22. return true;
  23. }
  24. }

支付抽象类

桥接支付模式,定义抽象角色功能

  1. /*
  2. *支付抽象类 (抽象化角色)
  3. */
  4. public abstract class Pay {
  5. //桥接对象
  6. protected IPayMode payMode;
  7. public Pay(IPayMode payMode) {
  8. this.payMode = payMode;
  9. }
  10. //划账功能
  11. public abstract String transfer(String uId, String tradeId, BigDecimal amount);
  12. }

支付渠道

实现具体支付渠道,调用支付模式验证

  1. /**
  2. * 支付渠道-微信划账
  3. **/
  4. public class WxPay extends Pay {
  5. public WxPay(IPayMode payMode) {
  6. super(payMode);
  7. }
  8. @Override
  9. public String transfer(String uId, String tradeId, BigDecimal amount) {
  10. System.out.println("微信渠道支付划账开始......");
  11. boolean security = payMode.security(uId);
  12. System.out.println("微信渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);
  13. if(!security){
  14. System.out.println("微信渠道支付划账失败!");
  15. return "500";
  16. }
  17. System.out.println("微信渠道划账成功! 金额: "+ amount);
  18. return "200";
  19. }
  20. }
  21. /**
  22. * 支付渠道-支付宝划账
  23. **/
  24. public class ZfbPay extends Pay {
  25. public ZfbPay(IPayMode payMode) {
  26. super(payMode);
  27. }
  28. @Override
  29. public String transfer(String uId, String tradeId, BigDecimal amount) {
  30. System.out.println("支付宝渠道支付划账开始......");
  31. boolean security = payMode.security(uId);
  32. System.out.println("支付宝渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);
  33. if(!security){
  34. System.out.println("支付宝渠道支付划账失败!");
  35. return "500";
  36. }
  37. System.out.println("支付宝渠道划账成功! 金额: "+ amount);
  38. return "200";
  39. }
  40. }

测试

  1. public void test02() {
  2. System.out.println("测试场景1: 微信支付、人脸方式.");
  3. Pay wxpay = new WxPay(new PayFaceMode());
  4. wxpay.transfer("wx_00100100","10001900",new BigDecimal(100));
  5. System.out.println();
  6. System.out.println("测试场景2: 支付宝支付、指纹方式");
  7. Pay zfbPay = new ZfbPay(new PayFingerprintMode());
  8. zfbPay.transfer("jlu1234567","567689999999",new BigDecimal(200));
  9. }
扩展

使用桥接后,如果后续需要进行扩展,比如新增一个支付渠道为积分支付

扩展步骤如下

  1. /**
  2. * 支付渠道-积分划账
  3. **/
  4. public class CodePay extends Pay {
  5. public CodePay(IPayMode payMode) {
  6. super(payMode);
  7. }
  8. @Override
  9. public String transfer(String uId, String tradeId, BigDecimal amount) {
  10. System.out.println("积分渠道支付划账开始......");
  11. boolean security = payMode.security(uId);
  12. System.out.println("积分渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);
  13. if(!security){
  14. System.out.println("积分渠道支付划账失败!");
  15. return "500";
  16. }
  17. System.out.println("积分渠道划账成功! 金额: "+ amount);
  18. return "200";
  19. }
  20. }

桥接模式总结

桥接模式的优点:

  1. 分离抽象接口及其实现部分.桥接模式使用"对象间的关联关系"解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化.

  1. 在很多情况下,桥接模式可以取代多层继承方案.多层继承方案违背了单一职责原则,复用性差,类的个数多.桥接模式很好的解决了这些问题.

  1. 桥接模式提高了系统的扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有系统,符合开闭原则.

桥接模式的缺点:

  1. 桥接模式的使用会增加系统的理解和设计难度,由于关联关系建立在抽象层,要求开发者一开始就要对抽象层进行设计和编程

  1. 桥接模式要求正确识别出系统中的两个独立变化的维度,因此具有一定的局限性,并且如果正确的进行维度的划分,也需要相当丰富的经验.

桥接模式使用场景

  1. 需要提供平台独立性的应用程序时。 比如,不同数据库的 JDBC 驱动程序、硬盘驱动程序等。

  1. 需要在某种统一协议下增加更多组件时。 比如,在支付场景中,我们期望支持微信、支付宝、各大银行的支付组件等。这里的统一协议是收款、支付、扣款,而组件就是微信、支付宝等。

  1. 基于消息驱动的场景。 虽然消息的行为比较统一,主要包括发送、接收、处理和回执,但其实具体客户端的实现通常却各不相同,比如,手机短信、邮件消息、QQ 消息、微信消息等。

  1. 拆分复杂的类对象时。 当一个类中包含大量对象和方法时,既不方便阅读,也不方便修改。

  1. 希望从多个独立维度上扩展时。 比如,系统功能性和非功能性角度,业务或技术角度等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/958372
推荐阅读
相关标签
  

闽ICP备14008679号