代理模式

  • 简述: 为其它对象提供一个代理以控制对这个对象的访问
  • 示例:定义请求的抽象类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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值