- 简述: 为其它对象提供一个代理以控制对这个对象的访问
- 示例:定义请求的抽象类Request,RealRequest为真实的请求类,ProxyRequest代理RealRequest发送请求,封装RealRequest对request()的访问
/**
* @author beck.yang
* @date 2022/6/30 17:11
* @description 代理模式
*/
public class Main {
public static void main(String[] args) {
ProxyRequest proxyRequest = new ProxyRequest();
proxyRequest.request();
}
}
/**
* @author beck.yang
* @date 2022/6/30 16:58
* @description 代理类
*/
public class ProxyRequest extends Request{
private RealRequest realRequest;
@Override
public void request() {
if (realRequest == null) {
realRequest = new RealRequest();
}
System.out.println("Proxy...");
realRequest.request();
}
}
/**
* @author beck.yang
* @date 2022/6/30 16:57
* @description 请求类
*/
public abstract class Request {
public abstract void request();
}
/**
* @author beck.yang
* @date 2022/6/30 16:57
* @description 真实请求类
*/
public class RealRequest extends Request{
@Override
public void request() {
System.out.println("Request...");
}
}
- 强制代理-必须使用代理才能访问
/**
* @author beck.yang
* @date 2022/6/30 17:11
* @description 代理模式-强制代理
*/
public class Main {
public static void main(String[] args) {
RealRequest realRequest = new RealRequest();
realRequest.request();
System.out.println("-----------------------");
Request proxy = realRequest.getProxy();
proxy.request();
}
}
/**
* @author beck.yang
* @date 2022/6/30 16:57
* @description 请求类
*/
public abstract class Request {
public abstract void request();
public abstract Request getProxy();
}
/**
* @author beck.yang
* @date 2022/6/30 16:58
* @description 代理类
*/
public class ProxyRequest extends Request {
private Request request;
public ProxyRequest(Request request){
this.request = request;
}
@Override
public void request() {
System.out.println("Proxy...");
request.request();
}
@Override
public Request getProxy() {
return this;
}
}
/**
* @author beck.yang
* @date 2022/6/30 16:57
* @description 真实请求类
*/
public class RealRequest extends Request {
private Request proxy = null;
@Override
public void request() {
if (this.proxy == null) {
System.out.println("请使用代理...");
}else {
System.out.println("Request...");
}
}
@Override
public Request getProxy() {
if (this.proxy == null){
this.proxy = new ProxyRequest(this);
}
return this.proxy;
}
}
- 动态代理-代理模式的高级应用
1. 定义ProxyHandler类实现InvocationHandler接口,重写invoke()方法
/**
* @author beck.yang
* @date 2022/6/30 18:23
* @description 代理处理类
*/
public class ProxyHandler implements InvocationHandler {
Object obj;
public ProxyHandler(Object obj){
this.obj = obj;
}
public void before(){
System.out.println("Before request...");
}
public void after(){
System.out.println("After request...");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(this.obj, args);
after();
return result;
}
}
2. 定义抽象代理生成类DynamicProxy
/**
* @author beck.yang
* @date 2022/6/30 18:53
* @description 生成动态代理抽象类
*/
public class DynamicProxy<T> {
public static <T> T newProxyInstance(ClassLoader classLoader, Class<?>[] interfaces, InvocationHandler proxyHandler){
return (T) Proxy.newProxyInstance(classLoader, interfaces, proxyHandler);
}
}
3. 定义具体Request的代理生成类RequestProxy
/**
* @author beck.yang
* @date 2022/6/30 19:01
* @description 具体对象动态代理生成类
*/
public class RequestProxy extends DynamicProxy<RealRequest>{
public static Request newProxyInstance(Request request){
ClassLoader classLoader = request.getClass().getClassLoader();
Class<?>[] interfaces = request.getClass().getInterfaces();
InvocationHandler proxyHandler = new ProxyHandler(request);
return newProxyInstance(classLoader,interfaces,proxyHandler);
}
}
4. 定义被代理抽象类Request
/**
* @author beck.yang
* @date 2022/6/30 16:57
* @description 请求类
*/
public interface Request {
void request();
}
5. 定义被代理类的具体实现类RealRequest
/**
* @author beck.yang
* @date 2022/6/30 16:57
* @description 真实请求类
*/
public class RealRequest implements Request {
@Override
public void request() {
System.out.println("Request...");
}
}
6. 调用
/**
* @author beck.yang
* @date 2022/6/30 17:11
* @description 代理模式-动态代理
*/
public class Main {
public static void main(String[] args) {
Request request = new RealRequest();
Request proxyRequest = RequestProxy.newProxyInstance(request);
proxyRequest.request();
}
}