本文共 3210 字,大约阅读时间需要 10 分钟。
模板方法模式
(Template Pattern) 是一种 行为型模式
,基本思路是抽象类定义算法基本骨架,相同行为定义在抽象方法中,不同行为实现部分交给子类完成。
这里我们使用模板方法模式模拟一个支付功能,进行支付宝和微信支付,我们先定义一个支付功能的抽象类,这里提供了 4 个方法,callBack 封装处理流程的方法,verifyToken,payResult 这两个方法分别是验证 token 和流程处理的方法,在两种支付功能中代码实现不一样,所以定义为抽象类,由子类来实现,log 是打印日志,两种功能都需要打印日志,所以由抽象类统一实现。
public abstract class AbstractPayTemplate { //回调方法 public String callBack(Mapparm) { boolean res = verifyToken(parm); if (res) { log(parm); Map payResult = payResult(parm); return payResult.get("res"); } return "支付失败"; } //验证token protected abstract boolean verifyToken(Map parm); //打印日志 private void log(Map res) { System.out.println("记录日志 >>>" + res); } //返回结果 protected abstract Map payResult(Map parm);}
定义 2 种支付的实现类,继承抽象类,实现其各自的功能
@Componentpublic class AliPayTemplate extends AbstractPayTemplate { @Override protected boolean verifyToken(Mapparm) { return true; } @Override protected Map payResult(Map parm) { Map res = new HashMap<>(); res.put("res","阿里支付成功"); return res; }}
@Componentpublic class WeChatTemplate extends AbstractPayTemplate { @Override protected boolean verifyToken(Mapparm) { return true; } @Override protected Map payResult(Map parm) { Map res = new HashMap<>(); res.put("res","微信支付成功"); return res; }}
以上,就是模板方法的实现思路,现在我们做个测试,我们定义一个工厂模式,针对不同的需求,调用不同的实现类。
由于我们把两种支付的实现类都注入 Spring 容器中了,所以我们可以实现 ApplicationContextAware
动态从 Spring 中获取
@Componentpublic class PayFactory implements ApplicationContextAware { private static ApplicationContext applicationContext; /** * 工厂模式获取模板 */ public static AbstractPayTemplate getAbstractPayTemplate(String beanName) { AbstractPayTemplate abstractPayTemplate = applicationContext.getBean(beanName,AbstractPayTemplate.class); return abstractPayTemplate; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(PayFactory.applicationContext==null){ PayFactory.applicationContext = applicationContext; } }}
然后我们再写个接口,根据传参调用不同实现类
@RestControllerpublic class PayController { @RequestMapping("/pay") public String pay(String payName, String token) { AbstractPayTemplate abstractPayTemplate = PayFactory.getAbstractPayTemplate(payName); Mapparm = new HashMap<>(); parm.put("token", token); return abstractPayTemplate.callBack(parm); }}
访问下面链接,将会模拟返回不同结果
http://localhost:8080/pay?payName=weChatTemplate&token=123
http://localhost:8080/pay?payName=aliPayTemplate&token=123
模板方法模式
和策略模式
有什么区别模板方法模式是定义一个算法流程,将一些特定步骤的具体实现、延迟到子类。使得可以在不改变算法流程的情况下,通过不同的子类、来实现“定制”流程中的特定的步骤。
策略模式是使用一些算法相互替换,不影响返回结果。
优点
减少代码冗余,使代码结构更加清晰
缺点
不同实现需要定义子类,类增加,设计会更加抽象
1、某些业务中,使用了相同的方法,造成代码重复
—— 完
公众号:【星尘Pro】
github:
推荐阅读
转载地址:http://hyfsi.baihongyu.com/