代理模式
来源:互联网 发布: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
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- 常用APDU指令错误码
- ORA-00221 ORA-00206 ORA-00206 ORACLE用户对ASM没权限
- C++Builder建立及调用DLL
- 关于Less里的css一些规则,了解入门less
- PHP连接SQLserver中文字符编码报错的解决
- 代理模式
- 多渠道打包
- 字符集与编码格式
- CTF中常见的隐藏手段总结
- 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数
- Android Service 同时使用bindservice和startservice启动的问题
- 第1章 BashShell命令------------(设置环境变量)
- Andoird 自定义ViewGroup实现竖向引导界面
- 手动释放linux缓存——/proc/sys/vm/drop_caches