要想了解代理模式首先要知道什么是代理模式?代理模式的使用场景是什么,有什么优缺点。顾名思义,代理模式关键就是一个代理,为什么要代理,是因为原来的业务类已经不能满足需求的变化,如果直接在原来的业务类上修改,改动工作量大,而且容易引发新的问题,因此我们需要一个代理类,在代理类实现业务的扩展需要,实际上代理类并不真正实现服务,而是通过调用委托类的相关方法提供特定的服务。代理又包含静态代理和动态代理,静态代理是在程序运行前代理类的class字节码文件已经生成了,而动态代理则是在程序运行的过程中通过反射创建的。
一、静态代理
-
创建服务接口
public interface Work { //定义一个名字为work的方法 void work(); }
-
业务类实现接口,并实现接口
public class WorkImpl implements Work{ @Override public void work() { System.out.println("开始工作"); } }
3.这个类实现了工作方法,但是我们要在工作前加入吃饭,工作后加入健身的逻辑,创建代理类。
public class WorkProxy implements Work{ private Work work; public WorkProxy(final Work work) { this.work = work; } @Override public void work() { System.out.println("吃饭"); work.work(); System.out.println("进行健身"); } }
4.进行测试。
public class TestProxy { public static void main(String[] args) { Work work = new WorkImpl(); work.work(); System.out.println("----------"); WorkProxy workProxy = new WorkProxy(work); workProxy.work(); } }
测试结果:
开始工作
----------
吃饭
开始工作
进行健身
优点:我们在不改变原有对象的基础上,对原来的对象进行了扩展。
缺点:如果我们需要扩展的对象比较多,为每个对象创建代理类工作量也很大。
二、动态代理
使用动态代理的话,我们不需要手动创建代理类,真正的代理对象有JDK在我们使用的时候创建,我们需要编写动态处理器。
1.动态处理器编写。
package com.chongzi.keji.other; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxy implements InvocationHandler{ private Object object; public DynamicProxy(final Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("吃饭"); Object result = method.invoke(object, args); System.out.println("开始健身"); return result; } }
2.测试类的编写。
package com.chongzi.keji.other; import java.lang.reflect.Proxy; public class DynamicTest { public static void main(String[] args) { Work work = new WorkImpl(); Work proxyWork = (Work)Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), new Class[]{Work.class},new DynamicProxy(work)); proxyWork.work(); } }
测试结果:
吃饭
开始工作
开始健身