今天想介绍一下我工作当中用到的一个比较好的实践——模板方法模式实现扩展性良好的服务。抛砖引玉,希望各路大牛指教。
首先,简单介绍一下策略模式。
策略模式原材料:
1)一个接口,用于规范一系列策略,暴露统一的接口。
2)抽象类,可有可无,主要用于提供辅助类。
3)一系列策略类。
回到实际,如果我们需要编写一个WebService,提供注册,登录,验证,等等的功能,下面是模板方法模式的实践过程。
/**
统一的接口
**/
public interface IService {
public Response doService(Request request);
}
/**
辅助类
**/
public abstract class AbstractClass {
public Object json2Object(String json) {
//此处代表公共方法
//一般来说,会有工具类做JSON转换
return new Object();
}
}
/**
登录服务
**/
public class LoginService extends AbstractClass implements IService {
@Override
public Response doService(Request request) {
String body = request.getBody();
// 通常body会是JSON格式字符串,需要在此转成Object对象
Object user = json2Object(body);
Response response = new Response();
if (validate(user)) {
response.setMessage("Login Successfully");
response.setCode("0000");
} else {
response.setMessage("Login Failed");
response.setCode("9999");
}
return response;
}
private boolean validate(Object user) {
//...此处逻辑省略...
return true;
}
}
除了登录之后, 还可以有注册,验证,一大堆。同样的道理。
最后,入口就可以很潇洒的写成这样,又木有一种很容易扩展的赶脚。
public class Entry {
Map<String,IService> services = new HashMap<String,IService>();
public Response doProcess(Request request) {
IService service = services.get(request.getHead());
try {
return service.doService(request);
} catch (Exception e) {
Response response = new Response();
response.setCode("9999");
response.setMessage(e.getMessage());
return response;
}
}
private void init() {
services.put(LoginService.class.getName(), new LoginService());
services.put(SiginService.class.getName(), new SiginService());
services.put(ValidateService.class.getName(), new ValidateService());
}
}