代理模式
一. 静态代理
- 代理类实现被代理类实现的接口 或者 继承被代理类继承的父类;(这一项可以没有)
- 代理类持有被代理类的引用;
- 调用代理类方法时通过被代理类的引用调用被代理类的方法,并在调用方法前后可进行其他操作;
代码示例:
package com.skd.designMode.proxy; /** * 代理类 * 对于每个代理的方法必须手动逐个添加代理前后的操作 */ public class StaticProxy implements Phone { // 持有被代理类的引用 private Xiaomi xiaomi; public StaticProxy(Xiaomi xiaomi) { this.xiaomi = xiaomi; } @Override public void call() { // 调用方法之前 System.out.println("指纹解锁"); // 调用方法 xiaomi.call(); // 调用方法之后 System.out.println("砸手机"); } } /** * 共同实现的接口 */ interface Phone{ void call (); } /** * 被代理类 */ class Xiaomi implements Phone{ @Override public void call() { System.out.println("小爱同学,打电话给雷军"); } }
二. 动态代理
- 代理类必须实现被代理类实现的接口 (只能是接口)
- 代理类持有被代理类的引用;
- 调用代理类方法时通过被代理类的引用调用被代理类的方法,并在调用方法前后可进行其他操作; 对代理类的所有方法添加一套方法执行前后的逻辑操作
package com.skd.designMode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 动态代理 * 必须实现相同的接口(必须是接口) * 对代理类的所有方法调用前后添加一套逻辑 */ public class DynamicProxy implements InvocationHandler { // 持有被代理类的引用 private ProxyedPhone phone; public DynamicProxy(ProxyedPhone phone) { this.phone = phone; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 代理之前 System.out.println("打开流量"); // 代理 Object invoke = method.invoke(phone, args); // 代理之后 System.out.println("关闭流量"); return invoke; } public static void main(String[] args) { ProxyedPhone phone = new ProxyedPhone(); DynamicProxy handle = new DynamicProxy(phone); /* * 1.代理类的类加载器 * 2.代理类要实现的接口列表 * 3.指派方法调用的调用处理程序 */ NBPhone proxy =(NBPhone) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{NBPhone.class}, handle); proxy.sendMsg(); proxy.videoChat(); /* * 打开流量 * 发个消息 * 关闭流量 * * 打开流量 * 视频一下 * 关闭流量 */ } } /** * 共同接口 */ interface NBPhone{ void sendMsg(); void videoChat(); } /** * 被代理类 */ class ProxyedPhone implements NBPhone{ @Override public void sendMsg() { System.out.println("发个消息"); } @Override public void videoChat() { System.out.println("视频一下"); } }
三. CGLIB动态代理
简书: 深入理解CGLIB动态代理
如果文章对您有所帮助,可以点一下推荐