第十五周_S-设计模式之桥接模式

58 阅读2分钟

【大话设计模式】:桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化。

由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目地。

用if-else实现

public class PayController {
    private Logger logger = LoggerFactory.getLogger(PayController.class);

    public boolean doPay(String uId, String tradeId, BigDecimal amount, int channelType, int modeType) {
        if (1 == channelType) {//设定为微信支付
            logger.info("模拟微信渠道⽀支付划账开始。 uId: {} tradeId: {} amount: {}", uId, tradeId, amount);
            if (1 == modeType) {
                logger.info("密码支付");
            } else if (2 == modeType) {
                logger.info("人脸支付");
            } else if (3 == modeType) {
                logger.info("指纹支付");
            }
        } else if (2 == channelType) {//设定为支付宝支付
            logger.info("模拟支付宝渠道⽀支付划账开始。 uId: {} tradeId: {} amount: {}", uId, tradeId, amount);
            if (1 == modeType) {
                logger.info("密码支付");
            } else if (2 == modeType) {
                logger.info("人脸支付");
            } else if (3 == modeType) {
                logger.info("指纹支付");
            }
        }

        return true;
    }
    
}
@Test
public void test_pay(){
    PayController pay = new PayController();
    System.out.println("\r\n模拟测试场景;微信⽀支付、⼈人脸⽅方式。 ");
    pay.doPay("weixin_1092033111", "100000109893", new BigDecimal(100), 1, 2);
    System.out.println("\r\n模拟测试场景;⽀支付宝⽀支付、指纹⽅方式。 ");
    pay.doPay("zhifubao_jlu19dlxo111","100000109894",new BigDecimal(100), 2, 3);
}

直接 if-else 可以满足当前需求,并且直观易懂。但是后面地维护和扩展都会变得非常复杂。

桥接实现

支付渠道

public abstract class Pay {
    protected Logger logger = LoggerFactory.getLogger(Pay.class);
    protected IpayMode ipayMode;

    public Pay(IpayMode ipayMode) {
        this.ipayMode = ipayMode;
    }

    public abstract String transfer(String uId, String tradeId, BigDecimal amount);
}
public class VxPay extends Pay{

    public VxPay(IpayMode ipayMode) {
        super(ipayMode);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {
        logger.info("模拟微信渠道⽀支付划账开始。 uId: {} tradeId: {} amount: {}", uId, tradeId, amount);
        if(!ipayMode.security(uId)){
            return "0001";
        }
        return "0000";
    }
}

支付形式:

public interface IpayMode {
    boolean security(String uId);
}
public class PayCypher implements IpayMode{

    private Logger logger = LoggerFactory.getLogger(PayCypher.class);
    @Override
    public boolean security(String uId) {
        logger.info("密码支付");
        return true;
    }
}
@Test
public void test_pay1(){
    System.out.println("\r\n模拟测试场景;微信⽀支付、⼈人脸⽅方式。 ");
    Pay wxPay = new VxPay(new PayFaceMode());
    wxPay.transfer("weixin_1092033111", "100000109893", new
                       BigDecimal(100));
}

对两种实现独立出来并且进行组合以达到目得。

实际应用

JDBC 驱动是经典的桥接案例