首页 > 其他分享 >代理模式(Proxy Pattern)__浅谈与装饰器模式的区别

代理模式(Proxy Pattern)__浅谈与装饰器模式的区别

时间:2024-03-19 21:12:37浏览次数:21  
标签:__ 浅谈 代理 模式 Cat proxy import public

代理模式(英语:Proxy Pattern)为其他对象提供一种代理以控制对这个对象的访问。

 

代理模式和装饰器模式的共同点

  不改变原有组件的情况下增强其功能

 

代理模式和装饰器模式的差异

  代理模式可以实现延迟加载,即在需要时才真正创建原有组件,而不是在创建代理时就立即创建原有组件,这对于提高性能和节省资源是有益的。(延迟加载

  代理模式更着重于环绕组件的方式(代理行为)的赋加动作,装饰器模式则是在组件基础上做固有拓展(自身行为)。

 

代码演示(Java)

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class ProxyFactory implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = proxy.invokeSuper(obj, args);
        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        System.out.println("Method " + method.getName() + " execution time: " + elapsedTime + " ms");
        return result;
    }

}

// ------------------------------

public class Cat {

    public void meow(){
        System.out.println("meow~~~meow~~~");
    }
}

// ------------------------------

import net.sf.cglib.proxy.Enhancer;
import org.ashe.demo.domain.Cat;
import org.ashe.demo.proxy.ProxyFactory;

public class Ashe {

    public static void main(String[] args) {
        // 创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        // 设置被代理类的类对象
        enhancer.setSuperclass(Cat.class);
        // 设置回调函数
        enhancer.setCallback(new ProxyFactory());
        // 创建代理对象
        Cat proxy = (Cat) enhancer.create();
        // 调用代理对象的方法
        proxy.meow();
    }

}

 以上代理使用cglib动态代理实现了对Cat对象meow方法的监控,记录了meow方法的执行耗时时间。

值得注意的是被动态代理后,代理对象的所有行为已经被增加行为了,因此给Cat类增加新方法时,代理对象的新方法也会被监控执行耗时。

 

为什么要代理分为静态代理和动态代理?

  1. 减少重复代码: 动态代理可以在运行时动态地生成代理对象,不需要手动编写大量的代理类,从而减少了代码量。

  2. 灵活性: 动态代理可以代理任意接口或类,不需要为每个被代理的类或接口编写一个对应的代理类,提高了系统的灵活性。

  3. 适应性: 动态代理可以适应接口或类的变化,不需要修改代理类的代码。这种松耦合性使得系统更容易维护和扩展。

标签:__,浅谈,代理,模式,Cat,proxy,import,public
From: https://www.cnblogs.com/ashet/p/18083951

相关文章

  • Solon Web 文件上传的最佳实践
    文件上传是Web开发中最常见的一个应用场景。一般在处理数据时,会有两种常见的方案:直接把文件流放在内存里,或者把文件流先缓冲到磁盘。1、如果是高频且文件极小使用纯内存模式,默认即可。如果高频小文件,是不适合用“临时文件模式”的,磁盘可能容易刷坏。只能多配些内存!2、如果是......
  • 【置顶】世末歌者歌词
    给自己唱歌的时候用。蝉时雨化成淡墨渲染暮色渗透着勾勒出足迹与车辙欢笑声与漂浮的水汽饱和隔着窗同城市一并模糊了拨弄着旧吉他哼着四拍子的歌回音中一个人仿佛颇悠然自得等凉雨的温度将不安燥热中和寻觅着风的波折我仍然在无人问津的阴雨霉湿之地和着雨......
  • RTC原理
    学习资料:https://www.bilibili.com/video/BV1yE411h7uQ?p=59&vd_source=432ba293ecfc949a4174ab91ccc526d6 Imx6ull内部自带了一个RTC外设RTC类似于定时器,外接32.768M晶振,然后开始及时,RTC使用两个寄存器来保存计数值RTC的使用:打开RTC,RTC开始工作,我们要做的就是不断读取RTC计......
  • 一加3T三段式开关切换 openpilot 版本
    一加3T三段式开关切换openpilot版本 修改continue.sh 文件如下 通过SSH登录到EON中,把openpilot不同版本的代码克隆到 /data/forks 目录下,然后根据自己的需求修改 PATH_FORK_{N} 的路径即可。修改文件存储目录:第4行修改不同版本OP目录:5~7行(分别对应三段......
  • AOSP平台编写Android-ebpf程序(tracepoint)的一些map定义和使用问题,导致map和prog无法
     前言本片文章并不主要讲解在AOSP平台ebpf程序的整个编写流程,只是一些的map的定义使用问题,如有需要可查看,aosp平台的整个下载流程,以及简单的程序的编译和如何push到手机运行,这位up是我在ebpf领域探索的领路人,本站ID:LiujiaHuan13,如果有需要up本人后面会考虑写一篇aosp程序书写......
  • Python 数据持久层ORM框架 TorToise模块(异步)
    文章目录TortoiseORM简介TortoiseORM特性TortoiseORM安装TortoiseORM数据库支持TortoiseORM创建模型aerich迁移工具简介aerich迁移工具安装aerich迁移工具使用TrotoiseORM查询数据TrotoiseORM修改数据TrotoiseORM删除数据TrotoiseORM新增数据......
  • Hadoop与Spark的x86和ARM混合集群部署【环境搭建篇】
    ​笔者在完成课程设计时,突然想到把大数据框架同时部署到PC端虚拟机以及ARM架构的Linux板上,这篇博客记录集群部署流程以及例程测试。部署架构如下图:若下文与架构图冲突,则以架构图为准。运行环境:PC方面,使用两台Ubuntu20.04LTSFocalFossa虚拟机ARM板子则使用香橙派5(R......
  • VM创建win11虚拟机
    1.准备文件   通过微软官网下载iso磁盘映像文件https://www.microsoft.com/zh-cn/software-download/windows11 2.虚拟机创建 (1)创建新的虚拟机-导入win11iso文件;   (2)命名并选择安装位置;  (3)选择加密(最好找个是方保存下密码)   ......
  • 二维数组_细菌的繁殖与扩散
    任务描述在边长为9的正方形培养皿中,正中心位置有m个细菌。假设细菌的寿命仅一天,但每天可繁殖10个后代,而且这10个后代,有两个分布在原来的单元格中,其余的均匀分布在其四周相邻的八个单元格中。求经过n(1≤n≤4)天后,细菌在培养皿中的分布情况。输入格式:输入为两个整数,第一个整......
  • nginx配置域名指向
    nginx实现自己域名代理阿里云oss域名地址以下是一个示例的Nginx配置,使用服务器IP代理阿里云OSS域名的方法,并带有详细的代码注释。#定义一个新的upstream,命名为oss_backendupstreamoss_backend{#指定阿里云OSS的域名serveross-domain.aliyuncs.com;}#......