模板方法模式

前言

这设计模式法是最熟悉的了,搞过SDK接入的烂熟于心

模板方法模式

总体结构

abstracttemplateMethod: 抽象模板类,基本上包含固定的调用方法和一些留给子类扩展的抽象方法

ps:以下代码就以SDK接入为例

public abstract class AbstractTemplate {

    public final void working(){
        init();
        beginLogin();
        beginPay();
        endDoSomething();
    }

    protected void init(){
        System.out.println("本地初始化开始");
        realinit();
    }
    public abstract void realinit();

    protected void beginLogin(){
        System.out.println("本地登录开始");
        realLogin();
    }
    public abstract void realLogin();
    protected void beginPay(){
        System.out.println("本地支付开始");
        realPay();
    }
    public abstract void realPay();

    protected void endDoSomething(){
        System.out.println("流程结束");
        System.out.println("__________________________________");
    }
}

channel: 接入的各种渠道

public class AliChannel extends AbstractTemplate {
    @Override
    public void realinit() {
        System.out.println("支付宝渠道初始化");
    }

    @Override
    public void realLogin() {
        System.out.println("支付宝渠道登录");
    }

    @Override
    public void realPay() {
        System.out.println("支付宝渠道支付");
    }
}
public class WechatChannel extends AbstractTemplate {
    @Override
    public void realinit() {
        System.out.println("微信渠道初始化");
    }

    @Override
    public void realLogin() {
        System.out.println("微信渠道登录");
    }

    @Override
    public void realPay() {
        System.out.println("微信渠道支付");
    }
}
public class BaiduChannel extends AbstractTemplate {
    @Override
    public void realinit() {
        System.out.println("百度渠道初始化");
    }

    @Override
    public void realLogin() {
        System.out.println("百度渠道登录");
    }

    @Override
    public void realPay() {
        System.out.println("百度渠道支付");
    }
}

common: 统一调用的部分,不属于模板方法的类,只是为了更好写调用。

public class TemplateCommon {
    private static TemplateCommon mInstance;

    private TemplateCommon(){}

    public static TemplateCommon getInstance(){
        if(mInstance==null){
            synchronized (TemplateCommon.class){
                if (mInstance==null){
                    mInstance=new TemplateCommon();
                }
            }
        }
        return mInstance;
    }

    public void begin(AbstractTemplate template){
        template.working();
    }

main调用:

 //模板方法模式测试方法
    public static void testTemplateMethod(){
        AliChannel aliChannel=new AliChannel();
        WechatChannel wechatChannel=new WechatChannel();
        BaiduChannel baiduChannel=new BaiduChannel();
        TemplateCommon.getInstance().begin(aliChannel);
        TemplateCommon.getInstance().begin(wechatChannel);
        TemplateCommon.getInstance().begin(baiduChannel);
    }

输出结果:

本地初始化开始
支付宝渠道初始化
本地登录开始
支付宝渠道登录
本地支付开始
支付宝渠道支付
流程结束
__________________________________
本地初始化开始
微信渠道初始化
本地登录开始
微信渠道登录
本地支付开始
微信渠道支付
流程结束
__________________________________
本地初始化开始
百度渠道初始化
本地登录开始
百度渠道登录
本地支付开始
百度渠道支付
流程结束
__________________________________

个人总结

搞过SDK开发的都用过,基本上是在拥有固定的流程,又要面临很多不同的分支的时,可以把固定的流程写在抽象类里面,不同的分支的不同之处留给分支的之类自己处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值