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