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