【23设计模式】代理模式及其应用

12、认知地图的建模与学习 本博客系统介绍了认知地图的定义、背景及其在机器智能领域的应用,重点探讨了模糊认知地图(FCMs)的建模方法与优势。文章还对比分析了几种主流的认知地图模型(如Axelrod模型、Kosko模型等),并讨论了模型的稳定性条件及实际应用前景。通过智能制造和医疗诊断的具体案例,展示了认知地图在复杂因果推理中的强大能力,并提出了模型优化方向与未来研究展望。 阅读详情

通过操作代理对象来调用目标类,这样就可以实现调用者和目标对象的解耦合。

应用场景:AOP 的实现、RPC 远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。

代理的类型

静态代理

public interface Subject {
    void request();
}

// 真实类
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("访问真实主题方法...");
    }
}

// 代理类
public class SubProxy implements Subject {

    /**
     * 真实对象 (将真实对象委托给代理对象)
     */
    private RealSubject realSubject;

    @Override
    public void request() {
        if(realSubject == null){
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }

    // 方法增强
    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }
    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }
}
public static void main(String[] args) {
    SubProxy proxy = new SubProxy();
    proxy.request();
}

动态代理(JDK)

public interface AbstractSubject {
    void request();
}

public class RealSubA implements AbstractSubject {
    @Override
    public void request() {
        System.out.println("A对象被代理");
    }
}

public class RealSubB implements AbstractSubject {
    @Override
    public void request() {
        System.out.println("B对象被代理");
    }
}

// 代理类
public class DynamicProxy implements InvocationHandler {

    private Object obj;

    public DynamicProxy(Object obj){
        this.obj = obj;
    }

    @Override
    public Object invoke(Object o, Method m, Object[] args) throws InvocationTargetException, IllegalAccessException {
        m.invoke(obj, args);
        return null;
    }
}

实现InvocationHandler接口,即可被定义为代理类,核心方法invoke()有三个参数

  • Object proxy: 动态代理对象
  • Method method: 表示最终要执行的方法,真正的目标方法
  • Object[] args:向目标方法传递的参数
public static void main(String[] args) {

    InvocationHandler handler = new DynamicProxy(new RealSubA());

    //        ClassLoader classLoader = AbstractSubject.class.getClassLoader();
    //        System.out.println(classLoader);
    //
    //        Class<?>[] interfaces = AbstractSubject.class.getInterfaces();
    //        System.out.println(Arrays.toString(interfaces));

    AbstractSubject subject = (AbstractSubject) Proxy.newProxyInstance(
        AbstractSubject.class.getClassLoader(),
        new Class[]{AbstractSubject.class},
        handler);
    
    subject.request();
}

要用 JDK 动态代理的话,就需要知道目标对象的类加载器、目标对象的接口、目标对象是谁

Proxy.newProxyInstance()方法就是将目标对象绑定到代理类上去

简单解析

动态代理的优势在于能够很方便的对代理类中方法进行集中处理,而不用修改每个被代理的方法。因为所有被代理的方法(真正执行的方法)都是通过在 InvocationHandler 中的 invoke 方法调用的。所以我们只需要对 invoke 方法进行集中处理。

基础补充:反射

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;

Class类对象的实例化
Class.forname("com.xxx.xxx.xx") // 完整的包路径名
对象.getClass();
类.class
Class<?> aClass = Class.forName("com.algebra.common.login.LoginPerson");
Class<LoginPerson> loginPersonClass = LoginPerson.class;
LoginPerson p = new LoginPerson();
Class<? extends LoginPerson> pClass = p.getClass();
Class类
Construct类
Annotation类
Method类
Field类

代理实现方式

JDK

JDK代理是不需要依赖第三方的库,只要JDK环境就可以进行代理,需要满足以下要求:

  • 实现InvocationHandler接口,重写invoke()

  • 使用Proxy.newProxyInstance()产生代理对象

  • 被代理的对象必须要实现接口

实现方式见上述《动态代理(JDK)》

CJLIB

CGLib 必须依赖于CGLib的类库,需要满足以下要求:

  • 实现MethodInterceptor接口,重写intercept()

  • 使用Enhancer对象.create()产生代理对象

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class CjDynamicProxy implements MethodInterceptor {

    private Object obj;

    public CjDynamicProxy(Object obj){
        this.obj = obj;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        return method.invoke(obj, args);
    }
}
import org.springframework.cglib.proxy.Enhancer;

public static void main(String[] args) {
    
    // 代理类class文件存入本地磁盘方便我们反编译查看源码
    System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "./code");
    
    CjDynamicProxy proxy = new CjDynamicProxy(new RealSubA());
    Enhancer enhancer = new Enhancer();
    enhancer.setCallback(proxy);
    enhancer.setSuperclass(AbstractSubject.class);
    AbstractSubject realA = (AbstractSubject) enhancer.create();
    realA.request();
}

区分

  • 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP,可以强制使用CGLIB实现AOP
  • 如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

Mybatis中的动态代理

public class MapperProxy<T> implements InvocationHandler, Serializable {
	// ...
public class MapperProxyFactory<T> {
	// ...
uniapp - 最新实现hbuilder项目运行到ios基座或苹果ios真机设备详细教程,如何在ios苹果手机上真机运行测试,IOS自定义基座在线打包调试(uniapp项目如何在苹果手机上运行调试) uni-app,苹果,app,ios,设备,自定义基座,运行app到苹果手机,mac电脑,Xcode,hbuilderX,运行ios基座调试Uniapp,无需打包,苹果证书,ipa,运行失败,报错,无法启动,连接失败,出错,详细教程,如何解决这个问题,怎么办,申请iOS证书,运行项目到iOS基座,打包ios自定义基座,在iOS真机上运行,新手小白,超级详细的教程,dcloud如何苹果ios系统真机测试,调试基座失败,真机调试ios app,App基座安装后无法打开问题,真机运行时检测不到手机的问题或者基座安 阅读详情

相关推荐

车载毫米波雷达实战:用MATLAB复现DDMA-MIMO雷达的Empty-band算法(附代码解析)

本文详细介绍了车载毫米波雷达中DDMA-MIMO技术的实战应用,重点解析了Empty-band算法的原理与MATLAB实现。通过搭建仿真环境,文章深入探讨了发射天线通道解调与相位法速度解模糊两大核心难题的解决方案,并提供了完整的代码解析,为雷达算法工程师提供了从理论到实践的清晰指南。

hill8的博客 557

Java设计模式以及代理模式

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。

m0_68041576的博客 1002

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 271

java常用设计模式及其使用场景

设计模式的使用场景。 设计模式分为3大类型共23种: 创建型:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 最常见的设计模式有:单例模式、工厂模式、代理模式、构造者模式、责任链模式、适配器模式、观察者模式等 面试中对于设计模式,你应该明白不同...

qq_39172681的博客 4282

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析

本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。

weixin_29070861的博客 477

【PCIe 总线及设备入门学习专栏 1.3 -- PCIe 基础知识 lane和link介绍】

PCIe RC(Root Complex)是PCIe树的根节点,一个RC 可以包括多个 RP(Root Port),例如一个16 条 lane的PCIe RC 可以包括4个RP(4个x4的),或者8个RP(8个x2的)等等。在该模式下,数据传送由CPU执行I/O端口指令来按照字节或更大的数据单位来处理,占用大量的CPU资源,数据传输速度也大大低于DMA模式。国内应该有公司做出相应的phy芯片(例如芯动科技、牛芯半导体),毕竟常见的pcie 3.0才8 Gbps的速率,最新的6.0才64Gbps。

CodingCos的博客 2104

23种设计模式总结

23种设计模式总结 23种设计模式按类型可以分为三大类:创建型、结构型和行为型。 1、创建型 单例模式,工厂方法模式,抽象工厂、建造者模式,原型模式 2、结构型 代理模式、桥接模式、装饰者模式、适配器模式、门面模式、组合模式、享元模式 3、行为型 观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式 记一些常用的设计模式 工厂方法模式 当对象的创建逻辑比较复杂的时候,就可以使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离 clas

LI5852258的专栏 339

46、聚类算法在智能交通数据分析中的应用

本文探讨了聚类算法在智能交通数据分析中的应用,介绍了K-均值算法、K-中心点算法和基于模型的聚类算法的基本原理及特点,并结合实际交通数据讨论了其应用场景与挑战。通过聚类分析,能够从海量交通数据中发现隐藏模式,为交通管理和规划提供科学依据。文章还展示了具体的案例分析和实现流程,为未来智能交通系统的发展提供了参考。

zz67890的博客 133

浅谈设计模式

设计模式就是为了解决某类重复出现的问题而出现一套成功或者有效的解决方案。 作用: 1.以一种标准的形式工广大开发人员使用,编于学习和交流,使新的开发者更容易理解设计思路, 实现可维护性。 2.可重用性,可复用性,避免重复性工作。 3.可扩展性,易于修改。 4.提高开发效率和软件质量。 uml类图 ...

baidu_16370559的博客 925

本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程

在大模型遍地开花的今天,我们早已习惯与 AI 聊天,但真正能**接管本地任务、自动化工作流**的“数字员工”却寥寥无几。OpenClaw 正是这样一款开源利器——它不仅是可本地运行的 AI 私人助理,更像一个“AI 操作系统内核”,能读写文件、执行终端命令、控制浏览器,所有数据本地存储,兼顾隐私与效率。而 Skills 作为它的标准化插件系统,更是让这份能力无限扩展。 本文将从核心概念拆解入手,再分系统给出**保姆级本地部署步骤**,包含环境准备、安装配置、技能安装与验证,甚至覆盖新手最易踩的坑,让你一次

ZhangJiqun&191cm&85kg 2500

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2336

23种经典设计模式

为目标对象提供一个 “代理”(中间层),代理控制对目标对象的访问,并可在访问前后附加额外逻辑。实质上就是代理模式既保留了目标对象的原有行为,又能灵活扩展横切逻辑。定义一套统一标准,无论是目标对象还是代理对象都必须遵守这个标准。eg:保证「代理能替代目标对象」(里氏替换原则)—— 乘客不管找窗口还是 12306,都是用「购票」这个统一动作,不会因为渠道变了,操作方式就变了真正实现核心业务逻辑的对象。

m0_56263746的博客 1030

一文读懂AI协同办公领域发展和趋势

协同办公,又称OA,是指企业内部或外部各类人员之间利用信息技术来进行协作工作的一种形式。这种协作工作既可以由直接员工进行,也可以来自外部的咨询机构、合作伙伴或联营企业。协同办公的优势在于可以对资源进行有效管理和配置,各部门之间可以建立良好的协作关系,跨部门更好地实现资源共享。

女王の专属领地 2356

几种常用的设计模式介绍

转载:http://blog.youkuaiyun.com/xsl1990/article/details/16359289几种常用的设计模式介绍1.    设计模式的起源最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander。在1970年他的《建筑的永恒之道》里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现。在《建筑的永恒之道》里这样描述:模式是一条由三个部分...

小郑的博客 516

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JS —— 6、设计模式、设计模式分析、组件封装、ES6

28、设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是 语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基 础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。 这些模式可以分为三大类:创建型模式(Creational Patter...

weixin_45042569的博客 895

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式之简介及其分类

一,设计模式概述设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。二,模式分类简介1..策略模式:定义了算法家族,分别封装起来,让他们之间可以互相替换,此设计模式让算法的变化,不会影响使...

蜂蜜柚子茶 222

java第一课---反射和代理模式的学习

大家都知道设计模式有23种,但是每种的含义、实际的应用都很模糊。自己从16年4月从培训班出来工作就没有认真的理解过设计模式,都是拼了命的在做业务开发。所以成长的第一阶段就是先把23种设计模式好好理理。 设计模式的分三大类: 创建型模式 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式 行为模式 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模...

shixiezhilong的博客 200

简述一下你了解的设计模式

所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。 在GoF的《De...

weixin_34008784的博客 977

JAVA_23种设计模式

一、策略模式:The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 策略可以是具体的算法、...

GZHarryAnonymous的博客 688

23种设计模式之代理模式(Proxy Pattern)

本篇文章将23种设计模式中的代理模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

23种设计模式之代理模式

代理模式属于结构型设计模式,其核心思想是为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,并可以在不改变客户端代码的情况下增强或控制对象的访问。

JAVA开发区的博客 3764

瑞_23种设计模式_代理模式

本文章为瑞_系列专栏之《23种设计模式》的代理模式篇。在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2395

23种设计模式——代理模式:代码世界的幕后操盘

代理模式是一种结构型设计模式,通过创建代理对象控制对真实对象的访问。核心价值在于实现访问控制、延迟加载和附加逻辑(如权限验证、日志记录)。主要代理类型包括虚拟代理(延迟创建)、保护代理(权限控制)、远程代理(网络通信)和智能引用代理。典型应用场景包括Spring AOP、Hibernate延迟加载、RPC框架和安全系统。与装饰器模式不同,代理侧重访问控制而非功能增强。模式优点在于解耦客户端与真实对象,但可能带来性能开销和调试复杂度。动态代理(如JDK Proxy)相比静态代理更具灵活性,可在运行时生成代理类

qq_52077555的博客 1391

23种设计模式

保证一个类只有一个实例,并且提供一个访问该全局访问点它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式分为简单工厂、工厂方法、抽象工厂模式通过代理控制对象的访问,可以在这个对象调用方法之前、调用方法之后去处理/添加新的功能。(也就是AO的P微实现)代理在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,这也和Spring的(面向切面编程)很相似。

liuhm的博客 1732

Java23种设计模式之代理模式的学习

源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23种设计的模式的各种实现方式以及应用场景,非常适用于学习以及提高我们的设计思维,如果对大家有所帮助,请记得star一下给予作者一定的精神支持,你的star是我写出更好的博客的动力,谢谢大家。 代理模式(proxy pattern) 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种..

weixin_43246215的博客 2202

23种设计模式——代理模式

文章目录23种设计模式——代理模式1、什么是代理模式2、代理模式的优缺点3、代理模式的结构4、代理模式的分类4.1、静态代理4.2、动态代理4.2.1、InvocationHandler接口4.2.2、Proxy类4.2.3、动态代理实现5、代理模式的应用场景 23种设计模式——代理模式 1、什么是代理模式 背景: 一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又比如找女朋

万里顾一程的博客 2813
上一篇: K8S学习笔记之控制器Deamonset
下一篇: 斐波那契数列的四种实现方式
AlgebraFly
博客等级 码龄9年 260粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlgebraFly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值