1. 背景
最近闲暇时间看了一篇关于模板模式的文章, 仔细想了下很是巧妙;结合曾经做过的项目,现在想想都可以通过模板模式来实现,顾作次此文,以记之。
2. 概念
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
-----转自《菜鸟教程》
概念有些抽象,讲白话文意思就是,举个简单例子,一个项目要接入第三方支付有微信支付 支付宝支付,以及银行卡支付等等。。。。 接入流程基本都是一样的,只是入参,调用支付接口以及返回参数不一样,所以我们可以 把校验入参作为抽象方法剥离出来, 以及调用接口都剥离出来...这样即使在接入其他支付通道,我们也不用再修改原有代码,只有实现抽象模板里的抽象方法就可以实现需求了, 从而代码解耦的作用, 不影响其他支付通道。。。
下面我们就上代码:
3. demo代码实现
定义模板抽象方法:
package template;
/**
* 定义抽象支付模板类
*/
public abstract class AbstractPayTemplate<DTO, PO> {
/**
* 定义抽象方法,(校验参数) 具体子类来实现
* @param dto
*/
abstract void checkParms(DTO dto);
/**
* 定义抽象方法 (入参) 具体子类来实现
* @param dto
*/
abstract PO initParams(DTO dto);
/**
* 调用支付接口 像 微信支付, 支付宝支付, 以及第三方银行卡支付
* @param po
*/
abstract void sendUrl(PO po);
//公共逻辑
void pay(DTO dto) {
this.checkParms(dto);
PO po = this.initParams(dto);
sendUrl(po);
}
}
package template;
import com.alibaba.fastjson.JSONObject;
/**
* 通道一 支付宝通道实现
*/
public class AliPayProcess extends AbstractPayTemplate<String, JSONObject>{
@Override
void checkParms(String s) {
System.out.println("支付宝支付校验参数");
}
@Override
JSONObject initParams(String s) {
System.out.println("组装支付宝支付所用的必备参数");
return new JSONObject();
}
@Override
void sendUrl(JSONObject jsonObject) {
System.out.println("发起支付宝http请求");
}
}
package template;
import com.alibaba.fastjson.JSONObject;
/**
* 通道二 微信通道实现
*/
public class WxPayProcess extends AbstractPayTemplate<String, JSONObject> {
@Override
void checkParms(String s) {
System.out.println("微信支付校验参数");
}
@Override
JSONObject initParams(String s) {
System.out.println("组装微信支付所用的必备参数");
return new JSONObject();
}
@Override
void sendUrl(JSONObject jsonObject) {
System.out.println("发起微信http请求");
}
}
测试类实现
public static void main(String[] args) {
WxPayProcess wxPayProcess = new WxPayProcess();
wxPayProcess.pay("wx-pay");
AliPayProcess aliPayProcess = new AliPayProcess();
aliPayProcess.pay("ali-pay");
}
打印结果如下:
这样一个简单的模板模式demo就实现了,代码实现可能比较粗糙,后续会补充充实。