【Java】模板方法模式
今天介绍的是模板方法模式~
模板方法模式,由父类定制总体的框架,具体的细节由子类实现。
一般来说,模板方法中有3类方法:
- 抽象方法,父类声明方法待子类具体实现。比如例子的validate、save、update方法。
- 模板方法,编写总体的框架,调用其他方法实现业务,一般无须被子类重写。比如例子的saveOrUpdate方法。
- 钩子方法,父类本身带有默认实现,子类可按照需要重写。比如例子的log4Operation方法。
父类:
import java.util.Map;
public abstract class AbstractBusinessService {
/**
* 保存业务(模板方法)
* @param map 数据
* @return 操作记录数
*/
public final int saveOrUpdate(Map<String, Object> map) {
String result = this.validate(map);
if (result != null) {
throw new RuntimeException(result);
}
int num;
if (map.get("id") == null) {
num = this.save(map);
} else {
num = this.update(map);
}
this.log4Operation(map);
return num;
}
/**
* 校验(抽象方法)
*/
public abstract String validate(Map<String, Object> map);
/**
* 更新(抽象方法)
*/
public abstract int update(Map<String, Object> map);
/**
* 保存(抽象方法)
*/
public abstract int save(Map<String, Object> map);
/**
* 写操作日志(钩子方法)
*/
public void log4Operation(Map<String, Object> map) {
System.out.println("write business.log : " + map);
}
}
A子类:
import java.util.Map;
public class UserService extends AbstractBusinessService {
@Override
public String validate(Map<String, Object> map) {
System.out.println("User validateion.");
return null;
}
@Override
public int update(Map<String, Object> map) {
System.out.println("Update user.");
return 0;
}
@Override
public int save(Map<String, Object> map) {
System.out.println("Insert user.");
return 0;
}
}
B子类:
import java.util.Map;
public class RoleService extends AbstractBusinessService {
@Override
public String validate(Map<String, Object> map) {
System.out.println("Role validateion.");
return null;
}
@Override
public int update(Map<String, Object> map) {
System.out.println("Update role.");
return 0;
}
@Override
public int save(Map<String, Object> map) {
System.out.println("Insert role.");
return 0;
}
@Override
public void log4Operation(Map<String, Object> map) {
System.out.println("write t_business_log : " + map);
}
}
调用入口:
import java.util.HashMap;
import java.util.Map;
public class HowToUse {
public static void main(String[] args) {
AbstractBusinessService userServcie = new UserService();
Map<String, Object> userMap = new HashMap<String, Object>();
userMap.put("id", 1);
userMap.put("name", "nick huang");
userServcie.saveOrUpdate(userMap);
System.out.println();
AbstractBusinessService roleServcie = new RoleService();
Map<String, Object> roleMap = new HashMap<String, Object>();
roleMap.put("role", "admin");
roleServcie.saveOrUpdate(roleMap);
}
}
日志:
User validateion.
Update user.
write business.log : {id=1, name=nick huang}
Role validateion.
Insert role.
write t_business_log : {role=admin}
作者:Nick Huang 博客:http://www.cnblogs.com/nick-huang/
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,点赞或评论哦;如果您喜欢我的文章,请点击关注我哦~
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,点赞或评论哦;如果您喜欢我的文章,请点击关注我哦~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用