Java 23种设计模式之代理模式

xiaoxiao2021-02-28  77

代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。 代理模式分为三种

静态代理 动态代理 cglib代理

1. 创建一个实体类

public class Person implements Personable{ @Override public void eat() { System.out.println("eat 吃饭"); } }

2. 定义一个接口

public interface Personable { void eat(); }

3. 静态代理实现 持有该对象的引用 实现接口方法 调用该对象的方法

public class StaticProxy implements Personable{ private Person p; public StaticProxy(){ p = new Person(); } @Override public void eat() { System.out.println("刷牙洗脸打豆豆"); p.eat(); System.out.println("洗澡睡觉抱媳妇"); } }

4. 动态代理实现

/** * Created by Administrator on 2017/8/6. * 创建动态代理对象 * 动态代理不需要实现接口,但是需要指定接口类型 */ public class DynamicProxy { //维护一个目标对象 private Object target; public DynamicProxy(Object target){ this.target = target; } //给目标对象生成代理对象 public Object getProxy(){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("刷牙洗脸打豆豆"); Object invoke = method.invoke(target, args); System.out.println("洗澡睡觉抱媳妇"); return invoke; } } ); } }

5. cglib代理实现 需要加入一个cglib-nodep-2.2.jar的架包

/** * Created by Administrator on 2017/8/6. * 目标对象 不需要实现接口 */ public class User { public void eat(){ System.out.println("eat 吃饭"); } } //cglib代理类 public class CglibProxy implements MethodInterceptor { //维护目标对象 private Object target; public CglibProxy(Object target){ this.target = target; } //给目标对象创建一个代理对象 public Object getProxyInstance(){ //工具类 Enhancer enhancer = new Enhancer(); //设置父类 enhancer.setSuperclass(target.getClass()); //设置回调函数 enhancer.setCallback(this); //创建代理对象 return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("刷牙洗脸打豆豆"); //执行目标对象方法 Object invoke = method.invoke(target, objects); System.out.println("洗澡睡觉抱媳妇"); return invoke; } }

6. 测试类

public class ProxyTest { //静态代理 @Test public void test1(){ Personable proxy = new StaticProxy(); proxy.eat(); } //动态代理 @Test public void test2(){ Personable p = new Person(); System.out.println(p.getClass()); //不能传Person对象 需要指定接口类型Personable Personable p1 = (Personable) new DynamicProxy(p).getProxy(); System.out.println(p1.getClass()); p1.eat(); } //cglib代理 @Test public void test3(){ Person p = new Person(); System.out.println(p.getClass()); Person p1 = (Person) new CglibProxy(p).getProxyInstance(); System.out.println(p1.getClass()); p1.eat(); } }
转载请注明原文地址: https://www.6miu.com/read-68538.html

最新回复(0)