【大话设计模式】:桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化。
由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目地。
用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 驱动是经典的桥接案例