静态代理我们都是手动添加代理主题角色来实现代理,这里我们通过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();
}
}
执行结果如下:
中介代缴房屋租金和押金.
房东将房屋出租,交易成功!
中介给你房屋钥匙和租房合同.
贴上 静态代理和动态代理的代码,见附件
分享到:
相关推荐
`代理模式之动态代理.ppt`则可能是一个PPT文档,提供了代理模式的理论介绍和代码示例。 4. **学习与实践** 要深入理解动态代理,你需要动手编写代码,尝试创建自己的`InvocationHandler`并使用`Proxy`来生成代理...
在Java中,动态代理是代理模式的一种实现方式,它允许我们在运行时创建代理对象,这种方式比静态代理更加灵活。动态代理在JDK 1.3及以后的版本中得到了支持,主要涉及到三个核心类:`Proxy`、`InvocationHandler`和`...
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。
代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...
装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
代理模式主要分为静态代理和动态代理两种类型。 1. 静态代理 在静态代理中,代理类和目标类是在编译时就已经确定的,它们通常具有相同的接口。客户端通过代理类调用方法,代理类再转发到目标类。以下是一个简单的...
在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...
在Java中,代理模式可以通过静态代理和动态代理来实现。静态代理是在编译时就确定了代理关系,需要为每个真实对象创建一个对应的代理类。而动态代理(如Java的`java.lang.reflect.Proxy`类和`InvocationHandler`接口...
代理模式的实现通常有两种方式:静态代理和动态代理。静态代理是在编译时就确定了代理关系,需要为每个原始对象创建一个对应的代理类。动态代理则是在运行时动态创建代理对象,这通常通过Java的反射API或C#的`System...
在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...
代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...
详细而又简单的讲述了java动态代理设计模式