文章目录
1. 定义
委派模式的基本作用就是负责任务调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权,但是代理模式注重过程,而委派模式注重结果
委派模式并不是23种设计模式
2. 适用场景
基本作用就是负责任务的调用和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果
3. 代码实现
3.1 真正干活的对象
package com.zhunongyun.toalibaba.designpatterns.delegate.simple;
public interface IEmployee {
/**
* 工作
*/
void doing();
}
package com.zhunongyun.toalibaba.designpatterns.delegate.simple;
public class EmployeeA implements IEmployee {
@Override
public void doing() {
System.out.println("我擅长项目安全测试, 开始对项目进行安全测试");
}
}
package com.zhunongyun.toalibaba.designpatterns.delegate.simple;
public class EmployeeB implements IEmployee {
@Override
public void doing() {
System.out.println("我擅长架构设计, 开始进行项目架构设计工作");
}
}
3.2 被委托对象
package com.zhunongyun.toalibaba.designpatterns.delegate.simple;
import java.util.HashMap;
import java.util.Map;
public class Leader {
private Map<String, IEmployee> register= new HashMap<>();
public Leader() {
register.put("安全测试", new EmployeeA());
register.put("架构设计", new EmployeeB());
}
public void doing(String command) {
register.get(command).doing();
}
}
3.3 委托对象
package com.zhunongyun.toalibaba.designpatterns.delegate.simple;
public class Boss {
public static void main(String[] args) {
Leader leader = new Leader();
leader.doing("安全测试");
leader.doing("架构设计");
}
}
4. Spring中的Dispacher
有了Dispatcher做委派分发,用户在浏览器输入的url回调分发到对应的控制器中
4.1 具体干活的对象
package com.zhunongyun.toalibaba.designpatterns.delegate.spring;
public class UserController {
public void findUserInfoById(Long id) {
}
}
package com.zhunongyun.toalibaba.designpatterns.delegate.spring;
public class OrderController {
public void findOrderInfoById(Long id) {
}
}
4.2 Dispacher对象
package com.zhunongyun.toalibaba.designpatterns.delegate.spring;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class ServletDispatcher {
// 维护了所有的Controller与uri的映射信息
List<Handler> handlers = new ArrayList<Handler>();
public ServletDispatcher(List<Handler> handlers) {
Class<UserController> userControllerClass = UserController.class;
try {
handlers.add(new Handler(userControllerClass.newInstance(),
userControllerClass.getMethod("findUserInfoById",new Class[]{Long.class}),
"/system/user")
);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doServlet(HttpServletRequest request, HttpServletResponse response){
doDispatcher(request,response);
}
private void doDispatcher(HttpServletRequest request, HttpServletResponse response){
// 获取用户请求的URL
String requestURI = request.getRequestURI();
// 选择需要分发给哪个控制器
Handler handler = null;
for (Handler h : handlers) {
if(handler.url.equals(requestURI)){
handler = h;
break;
}
}
try {
// 执行控制器 让控制器干活
Object aa = handler.method.invoke(handler.controller, request.getParameter("1000"));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
class Handler {
private Object controller;
private Method method;
private String url;
public Handler() {}
public Handler(Object controller, Method method, String url) {
this.controller = controller;
this.method = method;
this.url = url;
}
public Object getController() {
return controller;
}
public Handler setController(Object controller) {
this.controller = controller;
return this;
}
public Method getMethod() {
return method;
}
public Handler setMethod(Method method) {
this.method = method;
return this;
}
public String getUrl() {
return url;
}
public Handler setUrl(String url) {
this.url = url;
return this;
}
}
}
在没有使用Spring的委派模式之前,Servlet需要在Mapping文件中进行配置uri与控制器的映射关系
Dispatcher解决了这个问题,不需要每写一个控制器都要去配置一下映射关系
<servlet>
<servlet-name>UserController</servlet-name>
<servlet-class>com.zhunongyun.toalibaba.designpatterns.delegate.spring.UserController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserController</servlet-name>
<url-pattern>/system/user</url-pattern>
</servlet-mapping>