代理模式

简介: 代理模式

1.静态代理

public interface Company {
    void cooperation();
}
public class Start implements Company {
    public void cooperation() {
        System.out.println("1");
    }
}

代理类

public class Agent implements Company {
    private Company company;
    public Agent(Company company) {
        this.company = company;
    }
    public void cooperation() {
        System.out.println("===before===");
        company.cooperation();
        System.out.println("===after===");
    }
}

调用

Company company=new Start();
Agent agent=new Agent(company);
agent.cooperation();

2.动态代理 jdk实现

public class JdkProxy implements InvocationHandler {
    private Company company;
    public JdkProxy(Company company) {
        this.company = company;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("=====before=====");
        Object result= method.invoke(company,args);
        System.out.println("=====after=====");
        return result;
    }
}

调用

动态生成代理对象需要调用JDK中的java.lang.reflect.Proxy类的newProxyInstance方法,这个方法需要三个参数:

@CallerSensitive

public static Object newProxyInstance(ClassLoader loader,]Class[] interfaces,InvocationHandler h)

ClassLoader loader:类加载器,用来加载目标对象类,因为是在运行时获得目标对象,所以肯定需要用到反射。

Class[] interfaces:目标对象类实现的接口集合,这些接口中定义目标对象可以执行的方法。

InvocationHandler h:这个参数代表的是动态代理对象在调用方法的时候,会将方法转发到哪一个invocationHandler对象身上,InvocationHandler是个接口,

需要自己实现它,然后定义自己的动态代理执行方法。

创建包含动态代理对象具体执行方法的实现类。

Company company = new Start();
JdkProxy jdkProxy = new JdkProxy(company);
Company proxy = (Company) Proxy.newProxyInstance(jdkProxy.getClass().getClassLoader(), company.getClass().getInterfaces(), jdkProxy);
proxy.cooperation();

3.cglib 动态代理

public class AloneStart {
    /** 合作 */
    public void cooperation() {
        System.out.println("is show time");
    }
}

代理类

package com.jd.xq.proxy;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * @author duanxiaoqiu
 * @Date 2019-12-18 14:44
 **/
public class CglibProxy implements MethodInterceptor {
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("=====before====");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("=====after====");
        return result;
    }
}
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(AloneStart.class);
enhancer.setCallback(new CglibProxy());
AloneStart aloneStart = (AloneStart) enhancer.create();
aloneStart.cooperation();

spring aop等


相关文章
|
28天前
|
设计模式 缓存 C#
C# 一分钟浅谈:装饰者模式与代理模式
【10月更文挑战第12天】本文介绍了面向对象编程中的两种常见设计模式:装饰者模式和代理模式。装饰者模式允许在运行时动态地给对象添加功能,而代理模式则通过代理对象控制对另一个对象的访问。文章详细讲解了这两种模式的概念、常见问题、如何避免问题以及代码示例,帮助读者更好地理解和应用这些设计模式。
35 13
|
4月前
|
设计模式
对于装饰器模式与代理模式的个人理解
摘要: 代理模式与装饰器模式虽相似,但目的不同。装饰器动态增强对象功能,如添加新特性,而不改变原有类。代理模式则用于控制访问,如优化昂贵操作或添加辅助服务(如日志),它可能在内部初始化原对象。用法上,装饰器由外部决定是否应用,允许链式创建,而代理通常内部调用,外部直接与代理交互,被代理对象可能独立不可用。
|
6月前
|
缓存 数据安全/隐私保护 C++
【C++】—— 代理模式
【C++】—— 代理模式
|
6月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
代理模式——为他人做嫁衣裳
代理模式——为他人做嫁衣裳
|
Java
代理模式
代理模式
34 1
|
Java 网络安全 Maven
代理模式的运用
代理模式的运用
54 0
|
设计模式 JavaScript
关于代理模式我所知道的
关于代理模式我所知道的
81 0
|
Java Spring
代理模式你了解多少
代理模式你了解多少
76 0
|
Arthas Java 测试技术
结构型模式-代理模式
结构型模式-代理模式
70 0