zoukankan      html  css  js  c++  java
  • Spring中常见的设计模式——委派模式

    一、委派模式的定义及应用场景

      委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果。委派模式在Spring中的应用很多,比如:DispatcherServlet。用现实中的案例就是:老板给项目经理下达任务,项目经理再分配任务给员工,员工完成任务后,再由项目经理向老板汇报。

      创建IEmployee员工接口:

    public interface IEmployee {
        void doing(String command);
    }

      创建员工A,B:

    public class EmployeeA implements IEmployee {
        @Override
        public void doing(String command) {
            System.out.println("I'm A ,我在做" + command);
        }
    }
    public class EmployeeB implements IEmployee {
        @Override
        public void doing(String command) {
            System.out.println("I'm B ,我在做" + command);
        }
    }

      创建项目经理:

    public class Leader implements IEmployee {
    
        private Map<String, IEmployee> targets = new HashMap<>();
    
        public Leader() {
            targets.put("加密", new EmployeeA());
            targets.put("登录", new EmployeeB());
        }
    
        //项目经理自己不干活
        @Override
        public void doing(String command) {
            targets.get(command).doing(command);
        }
    }

      创建老板:

    public class Boss {
        public void command(String command, Leader leader) {
            leader.doing(command);
        }
    }

      创建测试类:

    public class DelegateTest {
        public static void main(String[] args) {
            new Boss().command("登录", new Leader());
        }
    }

      委派模式注重的是结果,代理模式注重的是过程。

      委派模式注重内部的灵活和可复用性,策略模式注重可扩展性(外部扩展性)。

      委派模式的核心是分发、调度、派遣,委派模式是静态代理和策略模式的一种特殊组合。

    二、委派模式在源码中的体现

      来看一下Spring MVC中的DispatherServlet是如何实现委派模式的。先创建两个Controller:

    @RestController
    @RequestMapping("/order")
    public class OrderController {
    
        @RequestMapping(value = "/getOrderById", method = RequestMethod.POST)
        public void getOrderById(String mid) {
    
        }
    }
    
    @RestController
    @RequestMapping("/member")
    public class MemberController {
    
        @RequestMapping(value = "/getMemberById", method = RequestMethod.POST)
        public void getMemberById(String mid){
    
        }
    }

      分发任务,相当于项目经理

    public class DispatcherServlet extends HttpServlet {
    
    
        private void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
            String uri = request.getRequestURI();
    
            String mid = request.getParameter("mid");
    
            if ("/member/getMemberId".equals(uri)) {
                new MemberController().getMemberById(mid);
            } else if ("/order/getOrderById".equals(uri)) {
                new OrderController().getOrderById(mid);
            } else {
                response.getWriter().write("404 Not Found!");
            }
        }
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                doDispatch(request, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

      这个简单的委派模式应用就实现了,在Spring中还有很多用到委派模式,在源码中以Delegate结尾的地方就是实现了委派模式,例如:BeanDefinitionParserDelegate根据不同逻辑委派不同的逻辑解析BeanDefinition.

  • 相关阅读:
    文本设置超过几行显示...
    CSS内置的几个标准的伪类和伪对象
    正则替换URL地址为链接地址
    移动端某些机型touchend事件触发鸡肋
    zepto 扩展prevAll(),nextAll()方法
    火狐下window.event获取undefined问题
    哪些情况下margin-left和padding-left无效?
    兵部-2048
    HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。HTML 的上一个版本诞生于 1999 年。自从那以后,Web 世界已经经历了巨变。HTML5 仍处于完善之中。然而,大部分现代浏览器已经具备了某些 HTML5 支持。
    二分查找
  • 原文地址:https://www.cnblogs.com/xcgShare/p/11972946.html
Copyright © 2011-2022 走看看