Proxy模式是在客户端不方便或者不能直接访问业务逻辑时,通过第三方类提供访问的一种方法。这种代理除了提供业务逻辑访问之外,还可以增加业务功能,好比Decorator模式。通常情况下,它包含三个部分:
- 1.Component:需要提供的业务功能抽象
- 2.Proxy:代理类
- 3.RealComponent:真实需要提供的业务功能
UML图:
以下是归纳的经常使用代理的地方:
- 远程(Remote)代理:为一个位于不同的地址空间的对象提供代理,这个地址空间要么是用户不知道的,要么是没权限直接访问的。
- 虚拟(Virtual)代理:根据需要创建一个资源消耗大的对象,使得此对象只在需要时才被真正创建,像输入输出流,数据库连接,网络TCP连接等。
- Copy-on-Write代理:把Copy拖延到只有在需要Write的时候才采取行动。
- 保护(Protect or Access)代理:控制一个对象的访问,如果需要,可以给不同的用户提供不同的访问权限。
- Cache代理:为某一个目标操作结果提供临时的存储空间,以便多个客户端可以共享这些结果。
- 防火墙代理:保护目标,不让恶意用户接近。
- 分布式同步代理:使几个用户可以同时使用一个对象而没有冲突。
- 智能引用:当一个对象被引用时,提供一些额外的操作,如计算,记录状态等。
下面再谈一下Java的动态代理对对象代理的实现。这一块主要关注的API有java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler两个。Proxy类生成代理对象的代理实例,但对代理对象的方法调用则主要是通过InvocationHandler.invoke利用反射机制实现的。下面是一个包含了简单AOP的例子。
1.ProxyFactory:Proxy对象的生成工厂
/**
*
* @author xwood
*
* @param <T> 被代理类的接口类型
*/
public class ProxyFactory<T> {
/**
* 利用Class提供的方法实现代理的实例化
* @param clzz 被代理类的接口类型(Class 对象)
* @param target 实际被代理的对象实体, 主要用于InvocationHandler.invoke方法实现方法反射
* @return
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public T getProxyInstance(Class<T> clzz, Object target) throws NoSuchMethodException,
InvocationTargetException, IllegalAccessException,
InstantiationException{
InvocationHandler handler = new ProxyInvocationHandler(target);
Class<?> proxyClass = Proxy.getProxyClass(
clzz.getClassLoader(),
new Class[]{clzz});
@SuppressWarnings("unchecked")
T proxy = (T)proxyClass.getConstructor(new Class[]{InvocationHandler.class})
.newInstance(new Object[]{handler});
return proxy;
}
/**
* 利用Class提供的方法实现代理的实例化
* @param clzz 被代理类的接口类型
* @param target 实际被代理的对象实体, 主要用于InvocationHandler.invoke方法实现方法反射
* @return
*/
public T getProxyInstance1(Class<T> clzz, Object target) {
return (T)Proxy.newProxyInstance(clzz.getClassLoader(),
new Class[]{clzz},
new ProxyInvocationHandler(target));
}
/**
* @param args
*/
public static void main(String[] args) {
ProxyFactory<IProxyTarget> factory = new ProxyFactory<IProxyTarget>();
IProxyTarget proxy = null;
// try {
// proxy = factory.getProxyInstance(IProxyTarget.class);
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (InstantiationException e) {
// e.printStackTrace();
// }
proxy = factory.getProxyInstance1(IProxyTarget.class, new ProxyTargetImpl());
if(proxy == null) return;
// String reVal = (String)proxy.process(1);
// System.out.println(reVal);
proxy.process(1);
}
}
2.IProxyTarget: 被代理类的接口定义
public interface IProxyTarget {
public void process(int num);
}
3.ProxyTargetImpl: 实际的被代理对象
public class ProxyTargetImpl implements IProxyTarget {
@Override
public void process(int num) {
System.out.println("--------- Now, Well Done! Boy.");
//return String.valueOf(num);
}
}
4.ProxyInvocationHandler: 具体代理方法的执行逻辑
public class ProxyInvocationHandler implements InvocationHandler {
/**
* 被代理类型的实体对象
*/
private Object target;
/**
* 仅有于需要复杂AOP时针对每次代理实现的Aspect对象
*/
private Aspect aspect;
public ProxyInvocationHandler(Object target){
this.target = target;
}
public ProxyInvocationHandler(Object target, Aspect aspect){
this.target = target;
this.aspect = aspect;
}
/**
* 实际代理运行时的主要方法。
* 代理对象在被调用时,将被调用方法、参数及代理对象本身传递给invoke方法,
* 在invoke方法内实现真正的方法调用。这类似于Decorator模式中主方法的调用。
* 在invoke方法内的实现可以与proxy或者target完全无关,甚至也可以不用method
* 等传递的参数,具体如何使用根据实际情况而定。
* 在返回值方面,如果被代理方法有返回值,则采用invoke方法的返回值;否则,
* 依然返回空。
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(target, args);
//如果需要AOP处理,则可以将具体实现交给aspect进行处理。
//return aspect.processAspect(target, method, args);
//如果需要返回值,则采用invoke方法的返回值。
//return "123";
}
}
5.Aspect: AOP的切面构建类
public class Aspect {
private List<Advice> adviceMap;
//TODO 生成你的adviceMap
public void initiate(){
}
public Object processAspect(Object target, Method method, Object[] args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException{
Iterator<Advice> it = adviceMap.iterator();
Advice advice = null;
while(it.hasNext()){
advice = (Advice)it.next();
advice.processAdvice(1);
}
Object obj = method.invoke(target, args);
it = adviceMap.iterator();
while(it.hasNext()){
advice = (Advice)it.next();
advice.processAdvice(2);
}
return obj;
};
}
6.Advice: 具体AOP类型
public class Advice {
/**
*
* @param status: 1:before; 2:after;
*/
public void processAdvice(int status){
};
}
需要注意的一点就是Java的动态代理只能实现对接口的代理,所以要对某个对象进行代理,一定要提前定义好接口。
分享到:
相关推荐
Proxy 模式学习代码,包括静态代理,动态代理,cglib等
到工厂方法到抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解和比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下Proxy模式。
MySQL数据库中间件:基于C语言开发,包含59个文件,包括22个C源文件...该项目是一个分布式MySQL数据库中间件,采用Proxy模式设计,基于核心业务对象切分,旨在提供高效的数据库查询和处理能力,适用于分布式系统环境。
23种设计模式之十二(结构型模式)Proxy模式
设计模式C++学习之代理模式(Proxy)
内附完整配置教程和修改后的apache的httpd.conf文件和tomcat的server.xml配置文件,包含test测试项目,不包含apache和tomcat安装文件。 本教程参考网上资料,本机测试成功,如有问题可以私信说明。
代码仅供参考学习 。
NULL 博文链接:https://hello-player.iteye.com/blog/629340
Design Pattern: Proxy 模式(一) 48 Design Pattern: Proxy 模式(二) 49 Design Pattern: Chain of Responsibility 模式 53 Design Pattern: Command 模式 59 Design Pattern: Interpreter 模式 Design Pattern...
2.7 Proxy模式 3 行为模式.....55 3.1 Template模式 3.2 Strategy模式 3.3 State模式 3.4 Observer模式 3.5 Memento模式 3.6 Mediator模式 3.7 Command模式 3.8 Visitor模式 3.9 Chain of Responsibility模式 ...
设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) ...
我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler...在研究代理模式(Proxy模式)的朋友可以交流一下
软件设计模式,共包含二十多种模式,做IT的必备知识呀!
JAVA Proxy 代理模式
第26章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第27章 案例研究:气象站 第六部分 ETS案例研究 第28章 VISITOR模式 第29章 STATE模式 第30章 ETS框架 附录 附录A UML表示法I:CGI示例 附录B UML表示法...
代理模式典型的结构图为: 实际上,代理模式的想法非常简单。 代理模式的实现: 完整代码示例(code):代理模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并...
7.3.3 Lazy Loading和Proxy模式 7.3.4 Identity Map模式 7.3.5 Query Object模式 7.4 使用对象关系映射器 7.4.1 NHibernate 7.4.2 MS Entity Framework 7.4.3 ORM代码示例 7.5 小结 第8章 表示层 8.1 ...
C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式)
第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第二十七章 案例研究:气象站 第Ⅵ部分 ETS案例研究 第二十八章 VISITOR模式 第二十九章 STATE模式 第三十章 ETS框架 附录 附录A UML表示法Ⅰ:CGI...