设计模式之模板模式

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就实现了,代码实现可能比较粗糙,后续会补充充实。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值