代理模式

定义

给某一对象提供一个代理对象,并由代理对象控制对原对象的引用。

静态代理

有些情况下,一个客户不想或者不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用。代理模式中的角色有:

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

多思考,多尝试。
原文地址:https://www.cnblogs.com/LynnMin/p/9534417.html