代理模式
Posted bockpecehhe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。
代理模式包括静态代理和动态代理
①静态代理
public interface Subject { void visit(); }
真实访问类
public class RealSubject implements Subject { private String name="mark"; @Override public void visit() { System.out.println(name); } }
静态代理类
缺点:每一个代理类都必须实现一遍委托类(也就是realsubject)的接口,如果接口增加方法,则代理类也必须跟着修改。其次,代理类每一个接口对象对应一个委托对象,如果委托对象非常多,则静态
代理类就非常臃肿,难以胜任
public class ProxySubject implements Subject { private Subject subject; @Override public void visit() { subject.visit(); } public ProxySubject(Subject subject){ this.subject=subject; } public static void main(String[] args) { ProxySubject proxySubject = new ProxySubject(new RealSubject()); proxySubject.visit(); } }
②动态代理
什么是动态代理?
动态代理有别于静态代理,是根据代理的对象,动态创建代理类。这样,就可以避免静态代理中代理类接口过多的问题。动态代理是实现方式,是通过反射来实现的,借助Java自带的java.lang.reflect.Proxy
,通过固定的规则生成。
其步骤如下:
编写一个委托类的接口,即静态代理的(Subject接口)
实现一个真正的委托类,即静态代理的(RealSubject类)
创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法
在测试类中,生成动态代理的对象。
-
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object object; public DynamicProxy(Object object){ this.object=object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(object, args); return invoke; } public static void main(String[] args) { RealSubject realSubject = new RealSubject(); DynamicProxy dynamicProxy = new DynamicProxy(realSubject); ClassLoader classLoader = realSubject.getClass().getClassLoader(); Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, dynamicProxy); subject.visit(); } }
以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章