该模式有点像建造者模式 不过又有区别
设计模式之桥接模式
支付方式选择
package com.example.设计模式.桥接模式.pay;
import com.example.设计模式.桥接模式.paymentmode.PayMy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
/**
* 抽象类 定义支付接口
*
* @Date:2022/4/12
* @author: ZLF
*/
public abstract class Pay {
protected Logger logger = LoggerFactory.getLogger(Pay.class);
/**
* 定义接口 这里主要要定义接口不然会报错找不到这个
*/
protected PayMy payMy;
public Pay(PayMy payMy) {
this.payMy = payMy;
}
/**
* 选择支付方法
* @param uId
* @param tradeId
* @param amount
* @return
*/
public abstract String payBaoAndWechat(String uId, String tradeId, BigDecimal amount);
}
wx
package com.example.设计模式.桥接模式.pay;
import com.example.设计模式.桥接模式.paymentmode.PayMy;
import java.math.BigDecimal;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public class WxPay extends Pay {
public WxPay(PayMy payMy) {
super(payMy);
}
@Override
public String payBaoAndWechat(String uId, String tradeId, BigDecimal amount) {
logger.info("模拟微信渠道⽀付划账开始。uId:{} tradeId:{} amount:{}",
uId, tradeId, amount);
// 安全校验
boolean security = payMy.security(uId);
logger.info("校验是否成功。security:{}", security);
if (!security) {
logger.info("模拟微信渠道⽀付划账拦截。uId:{} tradeId:{} amount: {}", uId, tradeId, amount);
return "400";
}
logger.info("模拟微信渠道⽀付划账成功。uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
return "200";
}
}
zfb
package com.example.设计模式.桥接模式.pay;
import com.example.设计模式.桥接模式.paymentmode.PayMy;
import java.math.BigDecimal;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public class ZfbPay extends Pay {
public ZfbPay(PayMy payMy) {
super(payMy);
}
@Override
public String payBaoAndWechat(String uId, String tradeId, BigDecimal amount) {
logger.info("模拟支付宝渠道⽀付划账开始。uId:{} tradeId:{} amount:{}",
uId, tradeId, amount);
// 安全校验
boolean security = payMy.security(uId);
logger.info("校验是否成功。security:{}", security);
if (!security) {
logger.info("模拟支付宝渠道⽀付划账拦截。uId:{} tradeId:{} amount: {}", uId, tradeId, amount);
return "400";
}
logger.info("模拟支付宝渠道⽀付划账成功。uId:{} tradeId:{} amount:{}", uId, tradeId, amount);
return "200";
}
}
定义实现方式接口
package com.example.设计模式.桥接模式.paymentmode;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public interface PayMy {
/**
* 安全校验接口
* @param uId
* @return
*/
boolean security(String uId);
}
模式一
package com.example.设计模式.桥接模式.paymentmode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public class Face implements PayMy {
protected Logger logger = LoggerFactory.getLogger(Face.class);
@Override
public boolean security(String uId) {
logger.info("人脸支付不安全");
return false;
}
}
模式二
package com.example.设计模式.桥接模式.paymentmode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public class Fingerprint implements PayMy {
protected Logger logger = LoggerFactory.getLogger(Fingerprint.class);
@Override
public boolean security(String uId) {
logger.info("指纹支付,据说世界上没有一模一样的指纹");
return true;
}
}
模式三
package com.example.设计模式.桥接模式.paymentmode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public class Phone implements PayMy {
protected Logger logger = LoggerFactory.getLogger(Phone.class);
@Override
public boolean security(String uId) {
logger.info("手机号码支付纯纯大冤种");
return false;
}
}
最后测试
编译看左边 最后方法调用实现了 桥接模式
package com.example.设计模式.桥接模式.test;
import com.example.设计模式.桥接模式.pay.WxPay;
import com.example.设计模式.桥接模式.pay.ZfbPay;
import com.example.设计模式.桥接模式.paymentmode.Fingerprint;
import com.example.设计模式.桥接模式.paymentmode.Phone;
import org.junit.Test;
import java.math.BigDecimal;
/**
* @Date:2022/4/12
* @author: ZLF
*/
public class PayTest {
@Test
public void test() {
System.out.println("微信支付+电话号码");
WxPay wxPay = new WxPay(new Phone());
wxPay.payBaoAndWechat("wx——1", "001", new BigDecimal(11111111));
System.out.println("支付宝支付+指纹");
ZfbPay zfbPay = new ZfbPay(new Fingerprint());
zfbPay.payBaoAndWechat("zfb-2", "002", new BigDecimal(22222222));
}
}