代理模式
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代理)优缺点使用场景))