zoukankan      html  css  js  c++  java
  • 委派模式

    委派模式:

      委派模式不属于23种设计模式, 主要角色有三种: 抽象任务角色, 委派者角色, 具体任务角色.实现层面上, 定义一个抽象接口, 它有若干实现类, 他们真正执行业务方法, 这些子类是具体任务角色; 定义委派者角色也实现该接口, 但它负责在各个具体角色实例之间做出决策, 由它判断并调用具体实现的方法.委派模式对外隐藏了具体实现, 仅将委派者角色暴露给外部, 在spring中以 Delegate与 Dispatcher结尾的,都是委派模式。其实委派模式就是代理模式跟策略模式的一种特殊的组合情况。

    应用场景:不属于 23 种设计模式之一,是面向对象设计模式中常用的一种模式。这种模式的原理为类 B和类 A 是两个互相没有任何关系的类,B 具有和 A 一模一样的方法和属性;并且调用 B 中的方法,属性就是调用 A 中同名的方法和属性。B 好像就是一个受 A 授权委托的中介。第三方的代码不需要知道 A 的存在,也不需要和 A 发生直接的联系,通过 B 就可以直接使用 A 的功能,这样既能够使用到 A 的各种功能,又能够很好的将 A 保护起来了,一举两得。

    意图:

      定义抽象接口的一个实现类, 他负责判断和调用哪个实现类的实例。

    优点: 对内隐藏实现, 易于扩展; 简化调用;

      委派模式大量使用在spring,mybatis等开源框架中, 理解委派模式的实现原理可以更好理解这些框架源码.委派模式的核心是委派类的实现.

      如Spring的DispatcherServlet.其实真的去执行方法的人并不是这个 DispatcherServlet,而实他通过handle中预先加载了各个contriller中method对应的URL,保存在内存中,当有请求过来,他拿到这个请求所对应的 URL,然后去比较,找到对应的就交给对应的Method去执行。

      这里举个简单的例子,通过 Boss去交代一个任务给项目经理, 项目经理(Leader)自己不干活,但是他知道可以由谁去干这个活,结果分配到手底下的人去做。

      先定义一个抽象类:

    public interface ITarget {
        //具体需要谁去干,由子类(项目经理)去决定
        // 需要怎么干,由员工定义
        void doing(String command);
     
    }

    先来两个员工(被委派者(Target)):

    public class TargetA implements ITarget {
        @Override
        public void doing(String command) {
            System.out.println("我是员工A,我现在开始干" + command + "工作");
        }
    }
    public class TargetB implements  ITarget {
        @Override
        public void doing(String command) {
            System.out.println("我是员工B,我现在开始干" + command + "工作");
        }
    }

    项目经理(委派者(Leader))登场:

    public class Leader implements  ITarget {
        //作为委派者,他必须知道底下的人谁比较擅长干什么
        // 就好比DispatcherServlet 里面哪个handle保存了 controller跟URL的对应关系一样
        private Map<String,ITarget> targets = new HashMap<String,ITarget>();
     
        public Leader() {
            // 员工A适合干加密工作
            targets.put("加密",new TargetA());
            // 员工B 适合干登陆开发
            targets.put("登录",new TargetB());
        }
     
        //项目经理自己不干活
        public void doing(String command){
            targets.get(command).doing(command);
        }
     
    }

    最后来个测试类,Boss 来发布任务了,这样子项目经理会委派底下的人去干活,而自己干了一下调度的活。

    public class Boss {
     
        public static void main(String[] args) {
     
            //客户请求(Boss)、委派者(Leader)、被委派者(Target)
            //委派者要持有被委派者的引用
            //代理模式注重的是过程, 委派模式注重的是结果
            //策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用
            //委派的核心:就是分发、调度、派遣
            //委派模式:就是静态代理和策略模式一种特殊的组合
            new Leader().doing("登录");
        }
    } 
  • 相关阅读:
    20.11.16 leetcode406 leetcode中的排序写法
    20.11.15 leetcode402
    20.11.14 leetcode1122(自定义排序)
    polyline NOIP模拟 数论 规律
    alien NOIP模拟 位运算 数论
    跳石头 vijos1981 NOIP2015 D2T1 二分答案 模拟 贪心
    寻找道路 vijos1909 NOIP2014 D2T2 SPFA
    不死的LYM NOIP模拟 二分+状压DP
    死亡的颂唱者 NOIP模拟 贪心 DFS
    无线网络发射器选址 vijos 1908 NOIP2014 D2T1 模拟
  • 原文地址:https://www.cnblogs.com/socketqiang/p/11262277.html
Copyright © 2011-2022 走看看