委派模式

在常用的23种设计模式中其实面没有委派模式(delegate)的影子,但是在Spring中委派模式确实用的比较多的一种模式,Spring MVC框架中的DispatcherServlet其实就用到了委派模式,在Spring的源码中,以Delegate结尾的地方都实现了委派模式。有前辈将其总结为代理模式和策略模式的组合。

委派模式的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做一种特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果

下面通过一个简单的实例来总结委派模式

实际应用场景

 


如图中所示,一个比较实际的例子,就是老板将任务委派给项目经理,项目经理将任务细化,根据每个人擅长的某一方面将细化后的任务分给指定的员工,权衡的方式(策略)有多种,而这个任务项目经理不想干,就将其代理给了各个员工,从这个层面来看委派模式就是策略模式和代理模式的组合。相关类图如下:

其中委派者为Leader,在实现过程中需要维护所有被委派者(员工)的引用。具体各个类的实现代码如下:
Boss,老板指派任务给项目经理

    public class Boss {
        public static void main(String[] args) {
    //        new Leader().dispatch("加密");
     
            new Leader().dispatch("销售");
        }
    }

普通职员接口 ITarget

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

项目经理(委派者)

    public class Leader {
     
        private Map<String ,ITarget> targets = new HashMap<String ,ITarget>();
     
        public Leader(){
            targets.put("加密",new TargetA());
            targets.put("销售",new TargetB());
        }
     
        public void dispatch(String command){
            targets.get(command).doing(command);
        }
    }

两个普通职员类

    public class TargetA implements ITarget{
     
        public void doing(String command) {
            System.out.println("开始进行加密算法的实现");
        }
    }

    public class TargetB implements ITarget{
        public void doing(String command) {
            System.out.println("开始开发销售代码");
        }
    }

运行实例较为简单,这里不单独列出。

Spring MVC框架中的DispatcherServlet其实就是用到的委派模式,针对之前的MVC执行流程无法理解的HandlerMapping其实就是这里的项目经理维护的各个员工的信息。上述实例中,为了简单,直接在构造函数中维护了相关实例的引用,但是在具体的HandlerMapping中,这一步显然要复杂的多,这个后期手动实现MVC框架的时候再进行深入探讨。
————————————————
版权声明:本文为CSDN博主「谜一样的Coder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liman65727/article/details/79720352

posted on 2016-01-19 19:46  duanxz  阅读(1349)  评论(0编辑  收藏  举报