package workengine;
public interface workUnit {
default void preValidate(){}
default void doBusiness(){}
default void aftervalidate(){}
}
package workengine;
import java.util.function.Function;
public interface Template {
public void execute();
}
package workengine;
import engine.WorkUnit;
import java.util.List;
public class TemplateImpl implements Template {
private ListworkUnits;
@Override
public void execute() {
for(WorkUnit workUnit:workUnits){
workUnit.preValidate();
workUnit.doBusiness();
workUnit.aftervalidate();
}
}
}
package purchase;
import context.RuntimeContexHolder;
import context.RuntimeContext;
import model.Request;
import model.Response;
import workengine.Template;
public class Purchase {
private Template template;
public Response doPurchase(Request request){
RuntimeContext runtimeContext=RuntimeContexHolder.currentRuntimeContext();
runtimeContext.setRequest(request);
template.execute();
return runtimeContext.getResponse();
}
}
package purchase;
import context.RuntimeContexHolder;
import context.RuntimeContext;
public class InitCarts {
public void initCarts(){
RuntimeContext runtimeContext= RuntimeContexHolder.currentRuntimeContext();
}
}
package context;
import model.Request;
import model.Response;
import model.ToString;
public class RuntimeContext extends ToString {
//各种业务对象
private Request request;
private Response response;
public Request getRequest() {
return request;
}
public void setRequest(Request request) {
this.request = request;
}
public Response getResponse() {
return response;
}
public void setResponse(Response response) {
this.response = response;
}
}
package context;
public class RuntimeContexHolder {
private static final ThreadLocalCURRENT_RUNTIME_CONTEXT=new ThreadLocal<>();
public static RuntimeContext currentRuntimeContext(){
RuntimeContext runtimeContext=CURRENT_RUNTIME_CONTEXT.get();
if(null==runtimeContext){
setCurrentRuntimeContext(new RuntimeContext());
}
return CURRENT_RUNTIME_CONTEXT.get();
}
public static void setCurrentRuntimeContext(RuntimeContext runtimeContext){
CURRENT_RUNTIME_CONTEXT.set(runtimeContext);
}
public static void clear(){
CURRENT_RUNTIME_CONTEXT.set(null);
CURRENT_RUNTIME_CONTEXT.remove();
}
}
使用线程上下文进行传值,这种方法还是比较low的,可以考虑使用上一遍文章中的注解进行不同业务之间进行值的传递