JAVA设计模式之-模板方法+(钩子函数)
1.定义
允许子类对父类的一个或多个步骤进行重写。例如聚合支付场景中有很多共同的步骤,比如验签、四要素验证、风控等等,但是在支付的时候走不同的渠道可能在调用和参数上有很大的不同,比如有的是xml,有的是json,等等。 我们就可以用父类实现通用的逻辑,由子类实现不同的交互逻辑。
2.模板方法+钩子函数示例
顶层接口 BasePay
public interface BasePay {
//移动支付
void mobilePay();
}
抽象类 AbstractBasePay
public abstract class AbstractBasePay implements BasePay {
@Override
public final void mobilePay() {
// 钩子函数
if (isCheckAuth()) {
checkAuth();
}
checkParam();
chenckRisk();
channlPay();
}
private void checkParam() {
System.out.println("检查参数");
}
private void checkAuth() {
System.out.println("支付权限校验");
}
private void chenckRisk() {
System.out.println("风控校验");
}
//渠道支付
abstract void channlPay();
//钩子函数,子类可以覆写,来选择手开启支付权限校验 默认不开启
boolean isCheckAuth() {
return true;
}
}
具体实现 1 中金支付
public class CPCNchannelPay extends AbstractBasePay{
@Override
void channlPay() {
System.out.println("中金支付");
}
boolean isCheckAuth() {
return false;
}
}
具体实现2 阿里支付
public class AliChannelPay extends AbstractBasePay{
@Override
void channlPay() {
System.out.println("阿里pay");
}
}
运行及结果
public class TestPay {
public static void main(String[] args) {
System.out.println("--中金支付start");
BasePay pay1 = new CPCNchannelPay();
pay1.mobilePay();
System.out.println("--中金支付end");
System.out.println("--阿里paystart");
BasePay pay2 = new AliChannelPay();
pay2.mobilePay();
System.out.println("--阿里payend");
}
}
结果:
复制代码
–中金支付start
检查参数
风控校验
中金支付
–中金支付end
–阿里paystart
支付权限校验
检查参数
风控校验
阿里pay
–阿里payend
我们可以看到中金支付中,我们把钩子返回设置成了false ,就没有进行支付权限校验