精华内容
下载资源
问答
  • 基于委托代理理论分析旅游、旅行社、导游人员之间的两层次委托代理关系,旅游与旅行社的委托代理关系是多对一的,旅行社与导游人员之间委托代理关系是存在主次代理人的,从而建立多对一存在主次代理人相结合的...
  • 代理模式与委托模式的异同点

    千次阅读 2018-09-09 00:58:43
    然而在实际开发中,我们通常可以很明确的知道一个模式究竟是代理模式还是委托模式,说明两者之间还是有一些区别的。 代理模式和委托模式的相同点很容易理解,都是把业务的需要实现的逻辑交给一个目标实现类来完成。...

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

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

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

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

    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            synchronized (getClassLoadingLock(name)) {
                // First, check if the class has already been loaded
                Class 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 stats
                        sun.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. 代理方法中不会有任何业务相关的逻辑存在,更不会改变真正的逻辑实现。

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

    展开全文
  • 文中通过分析房地产开发商与代理之间委托代理关系,指出在信息不对称的情况下,开发商和代理商都将有可能面临对方的道德风险。应用贝克尔一斯蒂格勒的委托代理模型深入分析了代理商采取道德风险的影响因素,...
  • 在风险投资中,风险投资与风险投资家之间存在委托-代理关系。针对风险投资与风险投资家信息不对称的问题,风险投资为了获得更大收益,会采用对自己更有利的契约来约束风险投资家。与传统模型相比,利用委托-...
  • 事件委托和事件代理

    2017-08-09 17:38:03
    如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了。使用事件委托技术能让你避免对特定的每个节点添加事件监听器;相反,事件监听器是被添加到它们的父元素上。事件监听器会分析从子...

    如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了。使用事件委托技术能让你避免对特定的每个节点添加事件监听器;相反,事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。基本概念非常简单,但仍有很多人不理解事件委托的工作原理。这里我将要解释事件委托是如何工作的,并提供几个纯JavaScript的基本事件委托的例子。

    假定我们有一个UL元素,它有几个子元素:

    <ul id="parent-list">
        <li id="post-1">Item 1</li>
        <li id="post-2">Item 2</li>
        <li id="post-3">Item 3</li>
        <li id="post-4">Item 4</li>
        <li id="post-5">Item 5</li>
        <li id="post-6">Item 6</li>
    </ul>

    我们还假设,当每个子元素被点击时,将会有各自不同的事件发生。你可以给每个独立的li元素添加事件监听器,但有时这些li元素可能会被删除,可能会有新增,监听它们的新增或删除事件将会是一场噩梦,尤其是当你的监听事件的代码放在应用的另一个地方时。但是,如果你将监听器安放到它们的父元素上呢?你如何能知道是那个子元素被点击了?

    简单:当子元素的事件冒泡到父ul元素时,你可以检查事件对象的target属性,捕获真正被点击的节点元素的引用。下面是一段很简单的JavaScript代码,演示了事件委托的过程:

    // 找到父元素,添加监听器...
    document.getElementById("parent-list").addEventListener("click",function(e) {
        // e.target是被点击的元素!
        // 如果被点击的是li元素
        if(e.target && e.target.nodeName == "LI") {
            // 找到目标,输出ID!
            console.log("List item ",e.target.id.replace("post-")," was clicked!");
        }
    });

    第一步是给父元素添加事件监听器。当有事件触发监听器时,检查事件的来源,排除非li子元素事件。如果是一个li元素,我们就找到了目标!如果不是一个li元素,事件将被忽略。这个例子非常简单,UL和li是标准的父子搭配。让我们试验一些差异比较大的元素搭配。假设我们有一个父元素div,里面有很多子元素,但我们关心的是里面的一个带有”classA” CSS类的A标记:

    // 获得父元素DIV, 添加监听器...
    document.getElementById("myDiv").addEventListener("click",function(e) {
        // e.target是被点击的元素
        if(e.target && e.target.nodeName == "A") {
            // 获得CSS类名
            var classes = e.target.className.split(" ");
            // 搜索匹配!
            if(classes) {
                // For every CSS class the element has...
                for(var x = 0; x < classes.length; x++) {
                    // If it has the CSS class we want...
                    if(classes[x] == "classA") {
                        // Bingo!
                        console.log("Anchor element clicked!");
    
                        // Now do something here....
    
                    }
                }
            }
    
        }
    });

    通过上面的介绍,大家应该能够体会到使用事件委托对于web应用程序带来的几个优点:

    1.管理的函数变少了。不需要为每个元素都添加监听函数。对于同一个父节点下面类似的子元素,可以通过委托给父元素的监听函数来处理事件。

    2.可以方便地动态添加和修改元素,不需要因为元素的改动而修改事件绑定。

    3.JavaScript和DOM节点之间的关联变少了,这样也就减少了因循环引用而带来的内存泄漏发生的概率。

    写到这里,突然想起了之前对于Dojo DataGrid的困惑:那么多的rows和cells,如何处理他们事件之间的关系。现在想想,使用委托就很简单了。所有的事件委托到grid最外层的节点上,当事件发生的时候通过一些方法来获取和添加事件的额外属性,如rowIndex, cellIndex,之后在分配到onRowClick,onCellClick之类的处理函数上。

    展开全文
  • java中实现代理委托代理模式

    千次阅读 2015-06-28 21:54:34
    InvocationHandler 用于实现代理。如果不用InvocationHandler接口实现代理的话,我们写代码是这样的:定义一个接口:Java codeinterface Greet { void sayHello(String name); void goodBye(); }实现这个接口:Java...

    InvocationHandler 用于实现代理。

    如果不用InvocationHandler接口实现代理的话,我们写代码是这样的:

    定义一个接口:

    Java code

    interface Greet
    {
        void sayHello(String name);
    
        void goodBye();
    }
    

    实现这个接口:

    Java code

    class GreetImpl implements Greet
    {
        public void sayHello(String name)
        {
            System.out.println("Hello " + name);
        }
    
        public void goodBye()
        {
            System.out.println("Good bye.");
        }
    }

    实现一个代理类

    Java code

    public class SimpleProxy implements Greet
    {
        private Greet greet = null;
    
        SimpleProxy(Greet greet)
        {
            this.greet = greet;
        }
    
        public void sayHello(String name)
        {
            System.out.println("--before method sayHello");
            greet.sayHello(name);
            System.out.println("--after method sayHello");
        }
    
        public void goodBye()
        {
            System.out.println("--before method goodBye");
            greet.goodBye();
            System.out.println("--after method goodBye");
        }
    
        /**
         * @param args
         */
        public static void main(String[] args)
        {        Greet tmp = new GreetImpl();        //生成代理
            Greet greet = new SimpleProxy(tmp);
         greet.sayHello("walter");
            greet.goodBye();
    
        }
    }

    ========================================================================

    代理其实没什么的,再看看如果实现了InvocationHandler接口,
    我们怎样实现代理。
    还是要实现原来的Greet接口。
    接口的实现还是GreetImpl。

    Java code

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class DebugProxy implements java.lang.reflect.InvocationHandler
    {
        private Object obj;
    
        public static Object newInstance(Object obj)
        {
            return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                    obj.getClass().getInterfaces(), new DebugProxy(obj));
        }
    
        private DebugProxy(Object obj)
        {
            //Greet接口的實現:GreetImpl
            this.obj = obj;
        }
     //Method m:調用的方法
    

    //Object[] args:方法要傳入的參數 //invoke实现对GreetImpl中方法的调用,同时也可以在这里加入自己想要实现的操作, //虽然调用原GreetImpl中的方法重要,但我想这里更看重的是通过自定义处理实现GreetImpl中没有的功能

    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
        {
            Object result;
            try
            {
                //自定義的處理
                System.out.println("--before method " + m.getName());
                //調用GreetImpl中方法
                result = m.invoke(obj, args);
            }catch(InvocationTargetException e)
            {
                throw e.getTargetException();
            }catch(Exception e)
            {
                throw new RuntimeException("unexpected invocation exception: " + e.getMessage());
            }finally
            {
                System.out.println("--after method " + m.getName());
            }
            return result;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            Greet tmp = new GreetImpl();
    
            Greet greet = (Greet) DebugProxy.newInstance(tmp);
               //生成的greet和tmp有相同的hashCode
               //通过DebugProxy构造的greet比原temp拥有更多功能
           greet.sayHello("walter");
               greet.goodBye();
        }
    }

    参考:
    http://leowzy.iteye.com/blog/725345
    还有一篇文章,也可以参考一下:
    http://www.cnblogs.com/soojoe/archive/2012/04/12/2532304.html

    疑问:

    动态代理和委托之间有什么关系?
    给的例子明明就是一个动态代理嘛。

    展开全文
  • 观察模式事件委托和代理模式

    千次阅读 2017-03-06 08:22:48
    什么是观察着模式当多个观察想要同时观察同一个主题对象的时候,的那个主题对象也就是我们的被观察的状态发生变化;观察能够回调自身的方法老更新自己. 实现步骤: 第一: 定义一个观察接口 第二 观察实现...

    什么是观察着模式

    当多个观察者想要同时观察同一个主题对象的时候,的那个主题对象也就是我们的被观察者的状态发生变化;观察者能够回调自身的方法老更新自己.
    实现步骤: 第一: 定义一个观察者接口 第二 观察者实现观察者接口
    第三: 要是有一个被通知着接口,里面有addObserver(Observer ob);removeObver(Onbserver ob); notifyObserver(Observer ob)方法
    第四: 在被观察者发生变化的时候: 调用notifyObserver(Observer ob);遍历List,回调observer里面的方法.
    ##我们常见的观察者模式的使用
    1.Android中的内容提供者就是采取了内容观察者模式:
    2.RecyClerView和ListView的Adapter就是采取了观察者模式;
    3.当两个界面想同时观察下载进度的话,可以采用观察者模式

    第二观察着模式的优缺点

    优点: 很好的解耦了通知着和观察者,观察者不需要的了解通知住着颞部是怎么实现的,方便日后的代码修改,体现了依赖到转的原则.
    缺点:
    1.抽象通知着还是依赖了抽象的观察者,当没有观察者的时候,是没有方法跟新的
    2.要求观察者的所有动作必须一样,如果不一样的话,不能实现.

    首先是RxJAVA的总结: 第一Rxjava是什么东西,主要是用于干什么的?
    第二: 就是Rxjava的好处和后年的RxAbdroid的联系
    第一: 什么是Rxjava: Rxjava就是: a library for composing ansynchronous and event-based programs
    using observable sequences for java vm(一个在java vm上使用可观测的序列来组成异步的,基于事件的程序的库);
    主要是:异步的了解
    异步中我们还是用过 handle和ansyncTask 都是异步的,
    他的优点不同于 handle和ansynctask俩说,最简洁的就是:简洁 随着程序逻辑变得越来越复杂,他依然能够保持简洁.
    // 观察者模式的详解: 在观察中: 一个警察和一个小偷,警察(观察者)需要观察小偷(被观察者)的动作,
    在小偷做出偷窃的时候做出相应的反应;这样的行为和观察者模式是十份的相近的,不一样的地方就是观察着不需要时时刻刻做出观察;
    二使用过回掉,当被观察者的的一个动作发生改变的时候;通过注册或者是订阅的方式告诉观察者;被观察的一个动作发生改变
    许一个实例: 点击事件 我们给一个 button设置一个点击事件 button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

            }
        });
        button在这里面相当于是一个被观察者,而OnClickListener就是一个观察者,通过setonClickListener建立了联系
        这个关系其实就是订阅的关系;
        那个button被点击的时候,也就是状态发生改变,此时Framework就会将点击事件发送给注册的OnClickListener;
        observable 可观察者  也就是被观察者; observer 也就是观察者     subscribe(订阅) Rxjava的回调方法中
        除了普通事件(onNext()事件)还定义了俩个特殊的事件,分别是: onCompleted()和onError()事件
        分别表示的是事件完成和事件处理的过程中出现错误,在一个正确运行的事件序列中有且只有一个特殊事件,并且是事
        件序列的最后一个.
    

    代理模式:

    后续补上: 在AIDL中会涉及到:

    展开全文
  • 第三方物流中物流服务委托方与物流服务代理之间关系是一种委托代理关系,而这种委托代理关系之间存在着信息不对称问题.论文运用委托代理理论对第三方物流中物流服务委托方与物流服务提供商之间委托代理关系进行...
  • 根据委托代理理论,提出实物期 权投资者和经营的价值模型,在实物期权经营对于项目价值信息隐匿条件下,应用极大值原理推导 出实物期权最优投资转移价值的解, 指出投资与项目价值、 转移价值与项目价值...
  • 物流金融服务模式博弈的委托代理分析,包玉梅,,本文从物流金融服务模式的角度分析了第三方物流、融资企业、商业银行之间委托代理关系,即第三方物流融资企业之间、第三方物
  • 基于最大化参与利益,进一步优化土地流转过程中土地资源配置效率的目的,本文构建了农民与中介组织,中介组织规模经营的双重委托代理模型。多对一一对多委托-代理关系,并找出最佳的工作量。 最后,分析了...
  • 委托代理关系的角度,对市政建设外包中代理风险的表现形式及其产生原因进行了剖析. 在此基础上,建立了市政建设外包中委托人与代理之间的博弈模型.通过模型的构建分析, 在激励相容条件的约束下,给出了该博弈的...
  • JavaScript事件代理(事件委托

    万次阅读 多人点赞 2019-01-11 15:03:44
    事件代理(Event Delegation),又称之为事件委托。是JavaScript中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown......)委托给父元素,让父元素担当事件...
  • 委托代理的框架下,通过构建一个n人团队的委托代理模型研究团队激励机制的优化问题。通过对模型求解,得到影响团队成员激励的因素,并进一步分析了成员能力、风险态度以及团队化程度对员工相对激励强度的影响。研究...
  • 研究表明: 委托人对代理人的最优分享系数与各个任务之间的相关系数联系密切, 并且会随着代理人的嫉妒偏好强度及同情偏好强度的增大而呈现先增大后减小的趋势. 本文的研究可以为解决现实中化工企业的委托代理问题...
  • JS中的事件委托和事件代理 什么是事件委托? 事件委托还有一个名字叫事件代理,JS高程上讲:事件委托就是利用事件冒泡,只制定一个时间处理程序,就可以管理某一类型的所有事件。我用取快递来解释这个现象: 有三...
  • JavaScript之事件委托和事件代理 事件委托概念: 事件委托还有一个名字叫事件代理,JS高程上讲:事件委托就是利用事件冒泡,只制定一个时间处理程序,就可以管理某一类型的所有事件。 简单的说就是原本需要一个一个...
  • 1.1.1 定义  委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数... 与委托的签名(由返回类型参数组成)匹配的任何方法
  • C#委托代理模式

    千次阅读 热门讨论 2014-03-09 11:13:09
    在设计模式的学习过程中,委托是一个不容易理解的知识点。尤其是在学完代理模式...委托的方法的使用可以向其他任何方法一样,具有参数返回值。  委托可以是对函数的抽象,即为函数的“类”,委托的实例对象将代表一
  • 在javasript中delegate这个词经常出现,看字面的意思,代理委托。那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口。这些接口又有什么特殊的用法呢?这篇文章就...
  • 在我们的日常生活中,委托-代理问题(principal-agent problem)随处可见,它一般指的是这样一种情况,当委托人(principal)授权于(delegate authority)代理人(agent)时,由于两个主体各自的目标...
  • [设计模式](六):装饰器模式(Decorator)和代理模式(Proxy)|委托模式(Delegater )
  • 在C#语言层面上,是有将观察模式用“事件委托”的方式来处理。 “委托”是一种应用方法的类型。 ...”是类与类之间关系委托提供了“一种方法的执行会同时执行加载在上面的方法”。是
  • 现代企业的所有者和经理人之间委托代理关系,如何防止信息不对称条件下经理人的机会主义行为是企业管理需要解决的重要问题。将经理人的努力分为生产性努力分配性努力,运用委托代理理论建立了基于企业所有者和...
  • 建设监理合同决定了业主与监理方之间委托代理关系.建设监理利用信息优势隐匿真实的努力水平,存在损害业主利益的“道德风险”.为实现监理任务多个控制目标之间的协调均衡实现,借助多任务委托代理最优合同模型,...
  • 在javasript中delegate这个词经常出现,看字面的意思,代理委托。那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口。这些接口又有什么特殊的用法呢?这篇文章就...
  • IOS代理协议与委托

    2015-10-28 23:27:10
    总结delegateprotocol关系拿来给大家分享一下:把自己不想干的一些事情(洗衣做饭)找个助手来帮助你做,而你要的这个助手得有一定的能力,不是任何一个人都可以的,所以你就得有个招聘要求。协议(protocol)就...
  • 针对这种关系,构造了 制造商、销售商消费委托代理模型。其中制造商即委托人的目标函数是利润最大化,销售商 即代理人的激励条件是不低于最低销售利润,销售商及消费代理人的参与条件是一组动态方 程。这一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,541
精华内容 13,416
关键字:

代理和委托之间的关系