代理模式

简介: 代理模式

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等


相关文章
|
6月前
|
设计模式
对于装饰器模式与代理模式的个人理解
摘要: 代理模式与装饰器模式虽相似,但目的不同。装饰器动态增强对象功能,如添加新特性,而不改变原有类。代理模式则用于控制访问,如优化昂贵操作或添加辅助服务(如日志),它可能在内部初始化原对象。用法上,装饰器由外部决定是否应用,允许链式创建,而代理通常内部调用,外部直接与代理交互,被代理对象可能独立不可用。
|
8月前
|
缓存 Java 数据安全/隐私保护
关于代理模式的相关配置方法
关于代理模式的相关配置方法
41 0
|
8月前
|
缓存 数据安全/隐私保护 C++
【C++】—— 代理模式
【C++】—— 代理模式
代理模式——为他人做嫁衣裳
代理模式——为他人做嫁衣裳
|
Java
代理模式
代理模式
37 1
|
Java 网络安全 Maven
代理模式的运用
代理模式的运用
70 0
|
设计模式 JavaScript
关于代理模式我所知道的
关于代理模式我所知道的
90 0
|
Java Spring
代理模式你了解多少
代理模式你了解多少
86 0
|
设计模式 缓存 监控
我学会了,代理模式
代理模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
103 0
我学会了,代理模式
|
存储 设计模式 缓存
万洋-什么是代理模式
简介: 影视导演找演员谈合作一般是不会直接找到演员本人,而是先找到演员的经纪人,先由经纪人洽谈,经纪人觉得合适的话就会与演员本人商讨合作事项,这个过程导演与演员是不直接接触的。 这里就用到了**代理模式**,导演其实想找的人是演员,但是要先找到是经纪人,再由经纪人找演员沟通。真正的价值在于演员,但是这个过程中,对于导演来说,经纪人与演员体现出了同样的价值,经纪人会全权代理演员与导演洽谈,经纪人会用自己的专业性过滤掉一些不好的合作意向,从而避免演员被频繁打扰。
135 0
万洋-什么是代理模式