模板方法模式用于定义实现功能的步骤框架,将这些步骤交由子类实现
子类可以重新定义某些步骤,而不用改变该功能的实现结构
模板方法模式的角色
抽象模板:定义整体流程
模板实现:实现流程的细节方法
抽象模板:消息发送器
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