设计模式之代理模式和动态代理
Posted 虚幻黑洞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之代理模式和动态代理相关的知识,希望对你有一定的参考价值。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
以下是代码实现:
package com.porxy; /** * 定义一个抽象类,含有一个抽象方法 */ public abstract class Subject { public abstract void Request(); } /** * 一个真实的类,被代理的对象 */ public class RealSubject extends Subject { @Override public void Request() { System.out.println("真实的请求"); } } /** * 代理类,其中含有一个对象的引用 */ public class Proxy extends Subject { RealSubject realSubject ; @Override public void Request() { if (realSubject == null){ realSubject = new RealSubject(); } realSubject.Request(); } } /** *客户端,通过调用代理对象,而实现真实类的方法 */ public class ProxyMain { public static void main(String[] args) { Proxy px = new Proxy(); px.Request(); } }
动态代理,底层应该就是封装了上面的代码,传入三个参数(类的加载,接口,代理对象)
InvocationHandler注释翻译: 调用处理程序是由代理实例的调用处理程序实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用被编码并发送到调用处理程序的调用方法
package com.porxy; /** * 声明一个接口,含有一个方法 */ public interface Subject { void Request(); } package com.porxy; /** * 实现类,也就是被代理的类,实现这个方法 */ public class RealSubject implements Subject { @Override public void Request() { System.out.println("一辆豪车启动"); } }
以下是动态代理类
package com.porxy;
import java.lang.reflect.*;
import java.lang.reflect.Proxy;
/**
* 先创建一个被代理的对象
*
*/
public class DynamicProxy {
public static void main(String[] args) {
final RealSubject realSubject = new RealSubject();
Subject instance = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
new Class[]{Subject.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// if ("Request".equals(method.getName())) {
//
// System.out.println("豪车加速");
//
// Object obj = method.invoke(realSubject, args);
//
// System.out.println("3秒破百");
// return obj;
//
// }
Object obj = method.invoke(realSubject, args);
return obj;
}
});
instance.Request();
}
}
/* 输出为:
豪车加速
一辆豪车启动
3秒破百 */
以上是关于设计模式之代理模式和动态代理的主要内容,如果未能解决你的问题,请参考以下文章