首页 > 其他分享 >代理模式的理论与实现

代理模式的理论与实现

时间:2023-08-13 14:36:19浏览次数:40  
标签:理论 Object 代理 模式 原始 proxiedObject public

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

目录

一、定义

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

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

二、作用

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

三、实现

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;
        }
    }
}

标签:理论,Object,代理,模式,原始,proxiedObject,public
From: https://www.cnblogs.com/csh24/p/17626530.html

相关文章

  • 建造者模式的理论与实现
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现四、总结一、定义建造者模式是一种创建复杂对象的设计模式。它将一个复杂对象的构建过程分解为多个简单的步骤,并且允许按照特定的顺序来构建对象。通过使用建造者模式,我们可以将对象的......
  • 工厂模式的理论与实践
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1简单工厂3.2工厂方法3.3简单工厂和工厂方法如何选择?3.4抽象工厂四、总结一、定义工厂模式是一种创建对象的设计模式。它提供了一种统一的接口来创建对象,而不需要直接使用构造函......
  • 不得不懂的技能——混合模式
    构造出一种烟雾缭绕的噶秘诀点这个按钮打开混合模式模式选择屏幕,就是滤色效果如果有一种灰蒙蒙的感觉复制一个副本,混合模式柔光如果觉得过度了,把不透明度降下来就好了......
  • 单例模式的理论与实现
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1饿汉式3.2懒汉式3.3双重检查3.4静态内部类3.5枚举四、总结4.1单例存在哪些问题?4.2单例有什么替代解决方案?一、定义单例模式是一种创建型设计模式,它确保一个类只有一个实例,并......
  • 模式匹配
    第14章模式匹配模式匹配是检查某个值(value)是否匹配某一个模式的机制,一个成功的匹配同时会将匹配值解构为其组成部分。它是Java中的switch语句的升级版,同样可以用于替代一系列的if/else语句。模式匹配有点像一个别致的switch声明,它可以侵入到表达式数据结构内部,对这个结构进行......
  • 多变量信息理论
    多变量信息理论是一种用于研究多个变量之间相互作用的方法。它可以帮助理解多个变量之间的关系,包括相关性、依赖性和交互作用等方面。以下是多变量信息理论的一些基本概念和应用:1.熵:熵是信息理论中的一个基本概念,用于衡量随机变量的不确定性。在多变量信息理论中,可以使用条件熵......
  • 完全背包理论基础
    完全背包跟01背包的代码区别就是在第二层背包的遍历的时候是正序的!先遍历物品还是背包是一样的//先遍历物品,再遍历背包privatestaticvoidtestCompletePack(){int[]weight={1,3,4};int[]value={15,20,30};intbagWeight=4;int[]dp=newint[b......
  • 如何获取大量不重复的高质量代理IP?
    在当前的网络环境下,获取高质量的代理IP变得越来越重要。对于需要大量代理IP的业务场景来说,这一点尤为重要。但是,市面上的代理IP质量良莠不齐,如何获取大量不重复的高质量代理IP成了许多人关注的问题。代理IP的基本概念代理IP是指通过代理服务器获取的IP地址,可以用于数据挖掘、网络营......
  • python创建代理报错[WinError 10061] 由于目标计算机积极拒绝,无法连接。
    [WinError10061]由于目标计算机积极拒绝,无法连接最近在学习《python3:网络爬虫开发实战》时遇到了一个问题,在创建代理的例子中,运行代码后报了以下的错误:修改计算机代理设置或者防火墙都无法解决,最后注释了proxy_handler的http的键值,运行成功,所以猜测可能不支持存在多个代理信......
  • 如何获取大量不重复的高质量代理IP?
    在当前的网络环境下,获取高质量的代理IP变得越来越重要。对于需要大量代理IP的业务场景来说,这一点尤为重要。但是,市面上的代理IP质量良莠不齐,如何获取大量不重复的高质量代理IP成了许多人关注的问题。代理IP的基本概念代理IP是指通过代理服务器获取的IP地址,可以用于数据挖掘、网络营......