在《设计模式之禅》(第二版)中,作者说“代理模式也叫做委托模式”,显然是认为代理模式和委托模式是毫无差别的。然而在实际开发中,我们通常可以很明确的知道一个模式究竟是代理模式还是委托模式,说明两者之间还是有一些区别的。

代理模式和委托模式的相同点很容易理解,都是把业务的需要实现的逻辑交给一个目标实现类来完成。

那么,他们的差别在哪里呢?之前看网上的一个解释说:代理模式的代理类和实现类是上下级关系,而委托模式的委托类和被委托类是平级关系。这么说有一定的道理,不过感觉用这样的平级和上下级的关系来描述这两种设计模式的区别,总是感觉有点牵强。

下面以我们最熟悉的类加载机制以及method.invoke()方法执行过程,来分析一下典型的委托模式的实现过程:

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

一般情况下,虚拟机加载一个类时,一般经过这三个步骤:

  1. 首先检查该类有没有被自己加载过,如果加载过了,直接返回加载过的Class类;否则,执行2;
  2. 交给父类加载,如果父类加载过了或者加载成功了,返回父类加载过的Class类;否则,执行3;
  3. 自己加载该类;

再看看method.inovke()方法的执行过程:

    public Object invoke(Object obj, Object[] args)throws IllegalArgumentException, InvocationTargetException{if (++numInvocations > ReflectionFactory.inflationThreshold()) {MethodAccessorImpl acc = (MethodAccessorImpl)new MethodAccessorGenerator().generateMethod(method.getDeclaringClass(),method.getName(),method.getParameterTypes(),method.getReturnType(),method.getExceptionTypes(),method.getModifiers());parent.setDelegate(acc);}return invoke0(method, obj, args);}

当invoke()方法执行的次数超过一个阈值是时,委托者会将inovke()方法的具体实现,从JNI的方式切换到动态生成一个java类代替invoke()方法。

类加载机制首先让父类加载,在加载失败的情况下自己尝试加载;而invoke()方法的执行过程有一个被委托者切换的这样一个逻辑存在。与这两者相比,我们思考一下代理模式的实现:

  1. 代理模式下,目标对象从头到尾不会有任何的改变;

  2. 代理方法中不会有任何业务相关的逻辑存在,更不会改变真正的逻辑实现。

与此相反,委托模式不仅可以自由切换被委托者,甚至可以自己实现一段逻辑(例如类加载器);

代理模式与委托模式的异同点相关推荐

  1. JAVA面试要点006---.net中的委托与java中的代理模式和委托

    1.1.1 定义 委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示: //Code in C# ...

  2. 深入理解iPhone委托模式兼谈iPhone生命周期

    深入理解iPhone委托模式兼谈iPhone生命周期(手把手教你iphone开发 - 基础篇) 作者:孙东风 2009-11-23(请尊重作者劳动成果,转载务必注明出处)   每个iPhone应用程序 ...

  3. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  4. 蓝懿IOS委托模式代理模式

    今天刘国斌老师讲了有关oc语言里的委托模式(代理模式),通过了一个打地鼠的游戏讲解了委托模式的功能作用,之后连带讲解了协议的书写和使用. 打地鼠功能包括屏幕随机出现地鼠,点击消失,如果不点击5秒后自动 ...

  5. [老码团队]Swift中的协议 - 用协议来实现委托模式

    委托是一种设计模式,它允许类或结构体将一些需要它们负责的功能交由(委托)给其他的类型的实例.在这种设计模式中,会涉及到几个角色: 公共接口(Interface):负责封装起需要被委托的功能 代理者(D ...

  6. 小话设计模式(番外二)委托模式

    委托(Delegate)模式定义了对象之间的一对一的关系,被委托方可以作为委托方的事件接收者或者数据源(Data Source),当它作为事件接受者的时候,可以认为它是一种特殊的观察者(参考小话设计模 ...

  7. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  8. 中介者模式、代理模式和外观模式的Pk

       在学习设计模式的时候,发现这三个模式在一定程度上很是相似.所以总结一下,加以区分. (一)中介者模式.     所谓中介,在我们生活中很是常见,我们买房子可以有中介公司,找兼职也可以有中介公司. ...

  9. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  10. PHP设计模式之委托模式(Delegation)了解下

    这个委托模式呢,就是通过分配或委托其他对象,它能够去除核心对象中的判决和复杂的功能性.来看一个经典的应用场景: 设计了一个cd类,类中有mp3播放模式,和mp4播放模式 改进前,使用cd类的播放模式, ...

最新文章

  1. ROS Kinetic或ROS melodic下安装MoveIt!出现的问题:无法定位软件包 ros-kinetic-moveit-full或ros-melodic-moveit-full
  2. 程序员必须知道的HTML常用代码有哪些?
  3. scala 多线程_Scala中的多线程
  4. PHP--金额数字转换成英文
  5. Intel超线程技术 Hyper-Threading Technology (7) - 最早的一篇超线程论文介绍
  6. 有味道的耳机!男子误食AirPods 排出后仍可正常使用
  7. 图片轮播插件-carouFredSel
  8. c++大作业--学籍管理系统--
  9. 外部中断器微型计算机课程设计,课程设计-电子时钟参考.doc
  10. https://www.bejson.com/devtools/properties2yaml/
  11. 十大编程语言排行,Java只能位列第三?
  12. android 跳转京东app,打开并跳转到京东app指定页面
  13. ios输入框被软键盘遮住问题
  14. 使Android Home键,Power键等按钮失效
  15. 输入圆锥体的半径和高,并求体积
  16. 计算机邀请函操作,Word计算机二级MS office常考内容——用邮件合并技术制作邀请函...
  17. Not live in vain——Leo关于生与死的感悟
  18. 伯克利分校研究生计算机排名及申请,加州大学伯克利分校排名及研究生申请条件...
  19. 使用cmake安装nuget
  20. 计算机怎么删除证书,win7电脑如何删除过期IE证书

热门文章

  1. 根据日期参数查询润乾报表
  2. 《当程序员的那些狗日日子》六
  3. 全局光照:光线追踪、路径追踪与GI技术进化编年史
  4. [system] Map key not configured
  5. 调试svo 中遇到的问题
  6. 大数据新闻推送你怎么看_人工智能选角大数据推送
  7. 使用多个路由器有线桥接实现无线漫游
  8. 桌面从c盘移到d盘怎么移回去
  9. 计算机网络中传输层传送的是什么,传输层
  10. SVG—最简单的SVG动画