设模技式中,往往都是通过增加一个中间层,解决问题。
代理模式。本身就很清楚,代理就是要控制所代理的产品,或者是商品。那么对于面向对象来说,代理,就是要控制对象了。这种控制,不论是处于什么原因,事实就是,我们可能需要控制一些对象的行为,增加些行为调前的处理或者调用后的处理等等。
如果仅从方法上看,感觉更像是拦截器。拦截一个方法,从中加入一些我们需要的东西。这么一说,就比如,我们在调用对象行为的时候,希望能记录日志,但是不用每次都在调用之前去打印这些日志,那么我们就可以通过代理模式来完成。这也是AOP编程的思想。
下面我们来看看UML吧。
从图中可以看到,实际上就是两个实现相同接口的类,一个作为代理拥有另一个。这样把被代理的类对客户隐藏起来了。当然,通过接口,客户可以针对接口编程,具体的对象甚至是生成对象都由代理类来做,这样可以实现一些延迟加载,需要时加载的功能。
所以,一旦使用代理模式,那么一个对象的生死,行为可能都被代理类控制了。
当然,如果需要代理的类,拥有一个庞大的接口以及多种实现,那么我们可能比较痛苦了。这是我们可能就需要动态代理来实现了。JDK自带的动态代理类正好帮我解决了这个问题,Spring AOP 也正是使用这种技术。那么我们来看一看如何使用。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ListProxy implements InvocationHandler {
//the relSubject
private Object target;
public Object getTarget(){
return target;
}
private ListProxy(Object obj){
target = obj;
}
//here we create the proxy
public static Object getInstance(Object obj){
if(obj != null){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
new ListProxy(obj));
}
return null;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result = null;
if(obj == null)
return null;
System.out.println("before processing list operation...");
result = method.invoke(target, args);
for(Object o:args){
System.out.println(o);
}
System.out.println("after processing list opertion...");
return result;
}
}
从上面的代码可以看到,动态代理使用的是反射技术。通过方式获取要代理的类以及要调用的方法。这种方法正式AOP使用的技术,(还有一个是使用CGLIB,CGLIB还可以代理类,JDK动态代理只能是针对接口,比如List)。
使用上面的代理类:
public class ProxyTtest {
public static void main(String args[]){
List<String> list = new ArrayList<String>();
@SuppressWarnings("unchecked")
List<String> lp = (List<String>)ListProxy.getInstance(list);
lp.add("this is main business!");
}
}
使用代理后,我们隐去了与业务核心无关的东西,比如日志记录,检查对象访问权限之类的事宜。是不是看起来很清爽呢?
结果:
before processing list operation...
this is main business!
after processing list opertion...
- 大小: 13.3 KB
分享到:
相关推荐
而"Influx-proxy"则可能是一个针对InfluxDB的代理服务,用于优化数据流入和查询效率。本文将详细探讨InfluxDB的核心特性和Influx-proxy的功能,并结合"Influx-proxy-2.5.7-linux-amd64.tar.gz"这个压缩包文件,解析...
ios-webkit-debug-proxy-1.9.0-win64-bin
而Qt4作为一个强大的开源库,提供了丰富的功能,使得开发者能够在多个操作系统上构建用户界面和应用程序。 首先,我们要理解设计模式的基本类型,包括创建型、结构型和行为型模式。创建型模式如单例模式(Singleton...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程。在 Node.js 开发中,`http-proxy-middleware` 是一款非常实用的中间件,主要用于将 HTTP 请求代理...
browsermob-proxy-2.1.4,与selenium一起进行爬虫,获取network中的链接资源
charles 解压就能用 charles-proxy-4.5.6-win64
`mysql-proxy-0.8.5-windows-x86-34bit` 是 MySQL Proxy 的一个特定版本,适用于32位Windows操作系统。 MySQL Proxy 的主要功能和优势包括: 1. **透明代理**:MySQL Proxy 可以悄无声息地插入到客户端和服务器...
charles-proxy-ssl-proxying-certificate.pem
代理服务器 BrowserMob Proxy,BrowserMob Proxy 简称 BMP,可以这么说,BMP 绝对是为 Selenium 为生的,Selenium + BMP 的完美搭配,可以实现很多你绝对想象不出来的功能
charles-proxy-4.5.6-win64.msi
MJ-PROXY-PLUS-3.8.6免授权,功能和商用版本相同,最新版本,由于MJ官网更新,老版本已无法使用MJ-PROXY-PLUS,安装方法和老版本一样,详细可参考MJ-PROXY-PLUS配置教程。 使用自己的MJ账号,支持GPT3.5自动翻译等。...
aws-kube-proxy1.16.8版本示例文件
node-https-proxy-agent, HTTPS端点的HTTP代理 `http.Agent` 实现 https-proxy-agent HTTPS的HTTP代理 http.Agent 实现 这个模块为连接到指定的HTTP或者HTTPS代理服务器提供了 http.Agent 实现,并且可以与内置的...
已测可用,注意参数一致" 这个标题表明我们关注的是一个与DMA(直接内存访问)相关的组件,名为dma-proxy,在Petalinux环境中已经过测试并且可以正常工作,但使用时需注意配置参数的一致性。 DMA 是一种计算机硬件...
browsermob-proxy-2.1.1-bin.zip
docker-letsencrypt-nginx-proxy-companion-examples, 结合 Docker gen和 letsencrypt Nginx 代理伙伴的示例 docker-letsencrypt-nginx-proxy-companion-examples这个库是使用 nginx代理插件, docker gen和 docker-...
赠送jar包:hadoop-yarn-server-web-proxy-2.6.0.jar; 赠送原API文档:hadoop-yarn-server-web-proxy-2.6.0-javadoc.jar; 赠送源代码:hadoop-yarn-server-web-proxy-2.6.0-sources.jar; 赠送Maven依赖信息文件:...
- 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。 - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式(Abstract Factory):...
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
java运行依赖jar包