静态代理我们都是手动添加代理主题角色来实现代理,这里我们通过JDK1.5+中提供的 java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态生成代理角色。 使其更灵活。
针对实现任何实现了接口Rent的真实主题角色类,可以动态生成代理主题角色类。
之前的程序我们改写如下:
Rent接口不变,代码:
package com.longewri.proxy.demo01;
/*抽象主题角色 使用接口来进行
*也可以使用抽象类*/
public interface Rent {
//租赁方法
public void rent();
}
Landlord实现类不变,代码:
package com.longewri.proxy.demo01;
/*
* Landlord 房东,真实主题角色 实现租赁接口Rent
* */
public class Landlord implements Rent{
public Landlord(){}
public void rent() {
System.out.println("房东将房屋出租,交易成功!");
}
}
实现接口InvocationHandler的代理处理类InvokHandler:
package com.longewri.proxy.demo01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class InvokHandler implements InvocationHandler {
// 此属性用来保存真实主题角色的引用
private Object realObject;
public void setRealObject(Object object) {
this.realObject = object;
}
public InvokHandler(Object obj) {
setRealObject(obj);
}
// 交付房屋押金
public boolean giveDeposit() {
System.out.println("中介代缴房屋租金和押金.");
return true;
}
// 拿到房屋钥匙
public void getKey() {
System.out.println("中介给你房屋钥匙和租房合同.");
}
// 实现该接口中的这个方法
public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
//设定返回值,方法定义中设置为Object类型,实际的返回类型我们可以根据实际调用的方法的返回类型来进行向下转型
Object result = null;
/*
* 执行真实主题中的方法,此处使用反射
* method表示的是所调用方法的Method对象,此处是rent方法的Method对象
* @object参数表示是由谁来调用这个方法 ,也就是真实主题角色 object args 表示调用的这个方法的参数类型
*
*/
if (giveDeposit()) {
result=method.invoke(realObject, args);
getKey();
}
return result;
}
}
静态工厂方法ProxyFactory,通过传递的真实主题角色 生成代理主题角色:
package com.longewri.proxy.demo01;
import java.lang.reflect.Proxy;
//静态工厂方法 返回代理类对象
public class ProxyFactory {
public static Object getProxy(Object realObject){
InvokHandler ih=new InvokHandler(realObject);
Object resultObject=Proxy.newProxyInstance(realObject.getClass().getClassLoader(),realObject.getClass().getInterfaces(), ih);
return resultObject;
}
}
终端用户Lessee 类 调用实例:
package com.longewri.proxy.demo01;
/*
* 终端用户(租户) 调用实例
* */
public class Lessee {
public static void main (String[] args){
//静态工厂动态生成代理主题角色
Rent rt=(Rent)ProxyFactory.getProxy(new Landlord());
rt.rent();
}
}
执行结果如下:
中介代缴房屋租金和押金.
房东将房屋出租,交易成功!
中介给你房屋钥匙和租房合同.
贴上 静态代理和动态代理的代码,见附件
分享到:
相关推荐
java模式设计-代理模式之动态代理.ppt
带视频讲解的代理模式之动态代理,有源代码和课件,很有帮助
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1
动态代理设计模式 日志和源码 动态代理设计模式 日志和源码
自己总结的代理模式和Java中的动态代理模式,有源码
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
详细而又简单的讲述了java动态代理设计模式
java中的装饰模式及动态代理模式示例源码,并且手写数据库连接池,以及展示动态代理模式在连接池中的使用
java代理模式和动态代理
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
JAVA设计模式之代理模式实例
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
- 代理模式 - 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事...
动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf动态代理设计模式详解.pdf
代理模式及动态代理是学习AOP的基础
动态代理设计模式-源码