定义
给某一对象提供一个代理对象,并由代理对象控制对原对象的引用。
静态代理
有些情况下,一个客户不想或者不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用。代理模式中的角色有:
1、抽象对象角色
声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象
2、目标对象角色
定义了代理对象所代表的目标对象
3、代理对象角色
代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象
举例
抽象对象角色;
package pattern.proxy;
/**
* 抽象对象角色
* @author Lynn
*
*/
public interface Server {
String getPageTitle(String url);
}
目标对象角色
package pattern.proxy;
/**
* 目标对象角色
* @author Lynn
*
*/
public class BaiduServer implements Server {
@Override
public String getPageTitle(String url) {
// TODO Auto-generated method stub
if("https://www.baidu.com/".equals(url)) {
return "百度首页";
}else if("https://wenku.baidu.com/".equals(url)) {
return "百度文库";
}else {
return "无标题";
}
}
}
代理对象角色
package pattern.proxy;
/**
* 代理對象角色;
* @author Lynn
*
*/
public class NginxProxyServer implements Server {
private Server server;
public NginxProxyServer(Server server) {
this.server = server;
}
@Override
public String getPageTitle(String url) {
// TODO Auto-generated method stub
return server.getPageTitle(url); //实际调用的时目标对象的方法;
}
}
动态代理
动态代理的核心就是将公共的逻辑抽象到InvocationHandler中
package pattern.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class NginxInvocationHandler implements InvocationHandler {
private Object object;
public NginxInvocationHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
return method.invoke(object, args);
}
}
测试
package pattern.proxy;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class TestProxy {
@Test
public void testStaticProxy() {
Server server = new BaiduServer();
Server proxyServer = new NginxProxyServer(server);
System.out.println(proxyServer.getPageTitle("https://www.baidu.com/"));;
}
@Test
public void testInvocationHandler() {
Server server = new BaiduServer();
NginxInvocationHandler handler = new NginxInvocationHandler(server);
Server proxy =(Server)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Server.class}, handler);
System.out.println(proxy.getPageTitle("https://www.baidu.com/"));
}
}
参考
https://www.cnblogs.com/xrq730/p/4907999.html
https://github.com/crossoverJie/JCSprout/blob/master/MD/SpringAOP.md