【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}

posted @   nick_huang  阅读(865)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示