[01][01][05] 委派模式详解

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>
发布了29 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/csharpqiuqiu/article/details/100057176