gpt4 book ai didi

代理模式的理论与实现

转载 作者:我是一只小鸟 更新时间:2023-08-13 14:31:10 27 4
gpt4 key购买 nike

本文实践代码仓库: https://github.com/goSilver/my_practice 。

目录
  • 1、定义
  • 2、作用
  • 3、实现
    • 3.1 代理模式的原理与实现
    • 3.2 动态代理的原理与实现

1、定义

代理模式是一种结构型设计模式,它允许 通过创建一个代理对象来控制对另一个对象的访问 。代理模式在不改变原始对象的情况下,提供了一种 间接访问对象 的方式,可以在访问对象 前后 进行一些额外的操作.

代理模式可以实现一些横切关注点的功能,例如延迟加载、权限控制、缓存等。它可以提供更加灵活和可扩展的方式来访问对象,并且可以对真实主题进行保护,以控制对其的访问.

2、作用

代理模式常用在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。我们将这些附加功能与业务功能解耦,放到代理类统一处理,让程序员只需要关注业务方面的开发。除此之外,代理模式还可以用在 RPC、缓存等应用场景中.

3、实现

3.1 代理模式的原理与实现

在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式.

3.2 动态代理的原理与实现

静态代理需要针对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板式的“重复”代码,增加了维护成本和开发成本。对于静态代理存在的问题,我们可以通过动态代理来解决。我们不事先为每个原始类编写代理类,而是在运行的时候动态地创建原始类对应的代理类,然后在系统中用代理类替换掉原始类.

                        
                          public class MetricsCollectorProxy {
    private MetricsCollector metricsCollector;

    public MetricsCollectorProxy() {
        this.metricsCollector = new MetricsCollector();
    }

    public Object createProxy(Object proxiedObject) {
        Class[] interfaces = proxiedObject.getClass().getInterfaces();
        DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject);
        return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);
    }

    private class DynamicProxyHandler implements InvocationHandler {
        private final Object proxiedObject;

        public DynamicProxyHandler(Object proxiedObject) {
            this.proxiedObject = proxiedObject;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            long startTimestamp = System.currentTimeMillis();
            // 执行被代理类的逻辑
            Object result = method.invoke(proxiedObject, args);
            long endTimeStamp = System.currentTimeMillis();
            long responseTime = endTimeStamp - startTimestamp;
            String apiName = proxiedObject.getClass().getName() + ":" + method.getName();
            RequestInfo requestInfo = new RequestInfo(apiName, responseTime, startTimestamp);
            metricsCollector.recordRequest(requestInfo);
            return result;
        }
    }
}

                        
                      

最后此篇关于代理模式的理论与实现的文章就讲到这里了,如果你想了解更多关于代理模式的理论与实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com