设计模式之桥接模式

198 阅读1分钟

一、概述

  • 桥接模式(Bridge Pattern):将实现和抽象放在两个不同的类的层次中,使两个层次可以独立改变
  • 核心实现就是A类中含有B类接口,通过构造器传递B类的实现,这个B类就是设计的桥
  • 在一些组合中,如果有每一个类都实现不同的服务可能出现笛卡尔积,而使用桥接模式就会非常简单

二、支付案例

  • 支付宝、微信均有人脸识别、指纹识别、密码三种方式支付 在这里插入图片描述 在这里插入图片描述
  • IPayMode是一个接口,往下有三种支付模式:刷脸支付、指纹支付、密码支付
  • Pay是一个抽象类,聚合了IPayMode,往下有两种继承方式:微信支付、支付宝支付
public interface IPayMode {
  /**
   * 验证安全性
   * @param uID 输入指定的用户ID,针对指定ID进行验证
   * @return 是否安全
   */
  boolean security(String uID);
}
public class PayFaceMode implements IPayMode {
  @Override
  public boolean security(String uID) {
    System.out.println("使用人脸识别");
    return true;
  }
}
public abstract class Pay {
  protected IPayMode payMode;

  public Pay(IPayMode payMode) {
    this.payMode = payMode;
  }

  public void setPayMode(IPayMode payMode) {
    this.payMode = payMode;
  }

  /**
   * 转账
   *
   * @param uId     用户ID
   * @param tradeId 目标用户ID
   * @param amount  数目
   * @return
   */
  public abstract boolean transfer(String uId, String tradeId, BigDecimal amount);
}
public class AliPay extends Pay {
  public AliPay(IPayMode payMode) {
    super(payMode);
  }

  @Override
  public boolean transfer(String uId, String tradeId, BigDecimal amount) {
    if (!payMode.security(uId)) {
      System.out.println("当前支付宝账户不安全");
      return false;
    }
    System.out.println("支付宝账户安全");
    System.out.println(uId + " 转账给 " + tradeId + " " + amount + " 元");
    return true;
  }
}
public class Client {
  public static void main(String[] args) {
    WechatPay wechatPay = new WechatPay(new PayFingerprintMode());
    wechatPay.transfer("1", "2", new BigDecimal("100"));
  }
}
  • 从桥接模式的实现形式来看,满足了单一职责和开闭原则,让每一部分内容都很清晰、易于维护和拓展。