今天介绍的是模板方法模式~
模板方法模式,由父类定制总体的框架,具体的细节由子类实现。
一般来说,模板方法中有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}