代理模式

Posted 木极子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

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

一、什么是代理模式

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

二、简单的代理

创建一个人的接口(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方法会返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 结构型模式 -- 代理模式(代理模式概述结构静态代理动态代理)

设计模式代理模式 ( 代理模式结构 | 客户端 | 主题对象 | 被代理对象 | 代理对象 )

设计模式 结构型模式 -- 代理模式(动态代理(CGLIB动态代理)三种代理的对比(静态代理动态代理(JDK代理和CGLIB代理)优缺点使用场景))

代理的模式和原理(代理的模式有几种)

代理模式、装饰者模式

设计模式-代理模式