代理模式

来源:互联网 发布:linux max map count 编辑:程序博客网 时间:2024/06/03 20:33

很喜欢的一句话:程序来自对生活的思考

一、什么是代理模式

解释什么是代理模式,其实最重要的还是“代理”这两个字,还是用生活的例子吧,如:小明要去买一包烟,可是呢,他自己没有时间去买,那么,他只能委托小李去买,小李就是代小明去买的人,小李就是小明的代理。

二、简单的代理

创建一个人的接口(Person):

package com.design.agent;public class Person {    private Person agentPerson;//代理人    private String name;//用户名    public Person(String name){        this.name = name;    }    public void maiyan(){        if(agentPerson==null){            System.out.println(this.name+"的烟");        }else{            agentPerson.maiyan();        }    }    public Person getAgentPerson() {        return agentPerson;    }    //设置代理人    public void setAgentPerson(Person agentPerson) {        this.agentPerson = agentPerson;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

创建一个测试(Test):

package com.design.agent;public class Test {    public static void main(String[] args) {        Person zhang = new Person("小张");//创建对象小张        Person li = new Person("小李");//创建对象小李        li.setAgentPerson(zhang);//设置小李的代理对象        li.maiyan();//小李执行的操作    }}

这是一个最简单的代理模式,关于代理的细节上面也写了。

三,实现动态代理

可以利用java实现动态代理,先跑程序吧,需要用到两个玩意:InvocationHandle,Proxy。
创建一个接口(AgentObjectInterface):

package com.design.agent;public interface AgentObjectInterface {    public void show();}

创建一个接口实现类(AgentObject):

package com.design.agent;public class AgentObject implements AgentObjectInterface{    private String name;    public AgentObject(String str){        this.name = str;    }    @Override    public void show() {        System.out.println("hello "+name);    }}   

创建一个代理类实例(MyInvocationHandle):

package com.design.agent;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandle implements InvocationHandler{    public Object target;    public void setTarget(Object target){        this.target = target;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        Object result = method.invoke(target, args);        return result;    }}

创建一个测试文件(Test2):

package com.design.agent;import java.lang.reflect.Proxy;public class Test2 {    public static void main(String[] args) {        AgentObject target = new AgentObject("zxm");        MyInvocationHandle mih = new MyInvocationHandle();        mih.setTarget(target);        AgentObjectInterface ao = (AgentObjectInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), mih);        ao.show();    }}

最后输出的结果是:hello zxm

关于InvocationHandle:它是代理实例的调用处理程序 实现的接口。每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
关于在InvocationHandle中有个invoke方法,这个方法有个参数Method,当它执行invoke的时候,对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
关于Proxy这个对象,这个对象的newProxyInstance方法会返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

0 0
原创粉丝点击