【Java】模板方法模式

时间:2022-06-29 07:06:40

今天介绍的是模板方法模式~

模板方法模式,由父类定制总体的框架,具体的细节由子类实现。

一般来说,模板方法中有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}