Java的署理模式
当前位置:以往代写 > JAVA 教程 >Java的署理模式
2019-06-14

Java的署理模式

Java的署理模式

前几天一个网友指出了我的文章中一些有失偏颇之处,那些文章都是我在阅读Java Core的时候做的总结,顺便加上我小我私家的一些领略。因为看的e文版,领略上有些处所大概还欠妥。下面谈一下对Java中署理模式(Proxy)的认识。

署理,想必各人都应该知道是什么冬冬了,一般的手机产商都有署理商,歌星们都有本身的经纪人,如此这些都可以看作是一种署理模式。下面我选择如下的一种情景来举办报告:某董事长出差,可是此时公司有个集会,董事长买单,可是由他的秘书去结帐。我们就权且把这个看作一个署理行为,^_^。

首先我们界说一个接口:商人(Merchant),如下所示:

package cn.edu.hust.cm.test;

public interface Merchant {

    void treat();//商人都要请客用饭滴,^_^

}

    然后我们界说一个类:董事长(Director),如下所示:

package cn.edu.hust.cm.test;

public class Director implements Merchant {

       public Director() {

       }

       public void treat() {

              System.out.println("董事长请各人用饭");

       }

}

OK,我们此刻要给他找署理了,这个署理就是他的秘书(Secretary)。这里要涉及到一些署理的机制了。在Java中,用来做署理的类一般都要实现InvocationHandler,实现它的invoke要领,至于为啥是这样俺也不知道了,^_^。别的,当我们发生一个署理实例(proxy instance)的时候,只要我们通过这个实例挪用任何要领,城市导致invoke要领的挪用,照旧看例子吧,如下所示:

package cn.edu.hust.cm.test;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

 

public class Secretary implements InvocationHandler {

       public Secretary(Director director) {

              this.director=director;

       }

       public Object invoke(Object arg0, Method arg1, Object[] arg2)

                     throws Throwable {

        director.treat();

              System.out.println("由秘书结帐咯!");

              return null;

       }

       private Director director;

}

此刻我们开始构建我们的主体测试代码,如下面的代码所示:

package cn.edu.hust.cm.test;


import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;


public class ProxyTest extends Proxy {

       public ProxyTest(InvocationHandler arg0) {

              super(arg0);

       }

       public static void main(String[] args) {

              Director director=new Director();

              InvocationHandler secretary=new Secretary(director);

              Merchant merchant=(Merchant)Proxy.newProxyInstance(director.getClass().getClassLoader(),director.getClass().getInterfaces(),secretary);

              merchant.treat();

       }

}

运行措施,输出将为:董事长请客

由秘书结帐咯!

这里有几个要说明的处所,如下所述:

1.Proxy.newProxyInstance要领的浸染,它的浸染为某个工具建设一个署理工具,本例中是为director建设了一个署理工具,这个工具属于哪个类呢?我们在措施内里加这样一句System.out.println(merchant.getClass().getName()),输出是$Proxy0,呵呵,说明已经发生了一个署理类了,这个类实现了director所属类中的所有接口。

2.署理的实现机制问题。小我私家以为这个好像就是一个事件处理惩罚的机制,当署理工具挪用某个要领的时候,就会触发相应的invoke要领。因此Proxy.newProxyInstance要领的第三个参数就相当于给这个署理工具注册了一个监听器。

Proxy类尚有几个要领,用法可以查察相应的API文档。

    关键字:

在线提交作业