模板方法模式

来源:互联网 发布:淘宝网已买到的宝贝 编辑:程序博客网 时间:2024/06/06 01:41

前言

这设计模式法是最熟悉的了,搞过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开发的都用过,基本上是在拥有固定的流程,又要面临很多不同的分支的时,可以把固定的流程写在抽象类里面,不同的分支的不同之处留给分支的之类自己处理。

原创粉丝点击