package designpattern.callbcak;
public interface CallBack<T extends Request,Q extends Response>{
default void before(T reqest){};
Q execute(T reqeust);
default void after(T reqeust,Q response){}
}
package designpattern.callbcak;
public class Request {
}
package designpattern.callbcak;
public class Response {
}
package designpattern.callbcak;
public interface Template<T extends Request,Q extends Response> {
<T extends Request,Q extends Response> Q execute(CallBack<T,Q> callBack,T request);
}
package designpattern.callbcak;
public class TemplateImpl implements Template {
@Override
public Response execute(CallBack callBack, Request request) {
Response data=null;
callBack.before(request);
data= callBack.execute(request);
callBack.after(request,data);
return data;
}
public static void main(String[] args){
TemplateImpl template=new TemplateImpl();
Request request=new Request();
template.execute(new CallBack() {
@Override
public void before(Request reqest) {
System.out.println("before");
}
@Override
public void after(Request reqeust, Response response) {
System.out.println("after");
}
@Override
public Response execute(Request reqeust) {
System.out.println("execute");
return null;
}
},request);
}
}