设计模式之策略模式

Pack 发布于 2020-03-02 14:41
阅读 301
收藏 0
分类:设计模式

/**

 * 相当于是项目经理的角色

 * Created by Tom.

 */

public class DispatcherServlet extends HttpServlet{


    private List<Handler> handlerMapping = new ArrayList<Handler>();


    public void init() throws ServletException {

        try {

            Class<?> memberControllerClass = MemberController.class;

            handlerMapping.add(new Handler()

                    .setController(memberControllerClass.newInstance())

                    .setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class}))

                    .setUrl("/web/getMemberById.json"));

        }catch(Exception e){


        }

    }


    private void doDispatch(HttpServletRequest request, HttpServletResponse response){


        //1、获取用户请求的url

        //   如果按照J2EE的标准、每个url对对应一个Serlvet,url由浏览器输入

       String uri = request.getRequestURI();


        //2、Servlet拿到url以后,要做权衡(要做判断,要做选择)

        //   根据用户请求的URL,去找到这个url对应的某一个java类的方法


        //3、通过拿到的URL去handlerMapping(我们把它认为是策略常量)

        Handler handle = null;

        for (Handler h: handlerMapping) {

            if(uri.equals(h.getUrl())){

                handle = h;

                break;

            }

        }


        //4、将具体的任务分发给Method(通过反射去调用其对应的方法)

        Object object = null;

        try {

            object = handle.getMethod().invoke(handle.getController(),request.getParameter("mid"));

        } catch (IllegalAccessException e) {

            e.printStackTrace();

        } catch (InvocationTargetException e) {

            e.printStackTrace();

        }


        //5、获取到Method执行的结果,通过Response返回出去

//        response.getWriter().write();


    }



    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        try {

            doDispatch(req,resp);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }



    class Handler{


        private Object controller;

        private Method method;

        private String 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;

        }

    }



}

为什么说handle是策略模式,而不是容器工厂
505
Pack
Pack

1、工厂关注的是为了创建某个产品。策略关注的点是实现的解耦。一种是创建、一种是行为。

2、然后在看handler,他的作用其实相当于是干了一个抉择。抉择是通过哪个controller,哪个Method 进行组合使用。注意是抉择而不是创建某个新的对象来干什么事情。所以是策略模式,而非工厂。

请先 登录 后评论