模式简介
-
模板方法模式用于定义实现功能的步骤框架,将这些步骤交由子类实现
子类可以重新定义某些步骤,而不用改变该功能的实现结构
-
模板方法模式的角色
抽象模板:定义整体流程
模板实现:实现流程的细节方法
模式实现
-
抽象模板:消息发送器
public abstract class MsgSender { /** * 检查消息格式 * * @param msg 消息 */ protected abstract void check(String msg); /** * 执行消息发送 * * @param msg 消息 */ protected abstract void exec(String msg); /** * 发送失败处理 * * @param msg 消息 * @param t 异常 */ protected abstract void error(String msg, Throwable t); /** * 发送消息主方法 * * @param msg 消息 * @return 是否发送成功 */ public boolean send(String msg) { check(msg); try { exec(msg); } catch (Throwable t) { error(msg, t); return false; } return true; } }
-
模板实现
// 邮件发送消息 public class EmailMsgSender extends MsgSender { @Override protected void check(String msg) { System.out.println("邮件发送前检查消息格式"); } @Override protected void exec(String msg) { System.out.println("邮件发送消息中"); System.out.println("邮件发送消息成功:" + msg); } @Override protected void error(String msg, Throwable t) { System.out.println("邮件发送消息失败:" + msg); } } // 短信发送消息 public class ShortMsgSender extends MsgSender { @Override protected void check(String msg) { System.out.println("短信发送前检查消息格式"); } @Override protected void exec(String msg) { System.out.println("短信发送消息中"); throw new RuntimeException(); } @Override protected void error(String msg, Throwable t) { System.out.println("短信发送消息失败:" + msg); } }
-
测试
public class TemplatePatternTest { @Test public void test() { MsgSender emailMsgSender = new EmailMsgSender(); emailMsgSender.send("hello email msg"); System.out.println("---------------------"); MsgSender shortMsgSender = new ShortMsgSender(); shortMsgSender.send("hello short msg"); } }
输出
邮件发送前检查消息格式 邮件发送消息中 邮件发送消息成功:hello email msg --------------------- 短信发送前检查消息格式 短信发送消息中 短信发送消息失败:hello short msg
UML
应用场景
-
模板方法模式可以将具有类似功能的子类中公共的行为提取出来,并集中到一个公共的父类中,从而避免代码重复
-
应用举例
Spring: JdbcTemplate、RedisTemplate