代理模式

JS设计模式之代理模式 Star这个类就是明星,StarProxy这个类就是明星经纪人,假如我们是商家,现在我们想请这个明星来参加我们的活动,我们开始和经纪人谈价格,talk出价1w,此时经纪人会做一个判断,如果价格大于等于1w,这个活动就比较适合,可以参加,代理就会去通知明星演出,如果小于1w的话,就不会,这个就是简单的代理模式,我们要访问明星,需要经过经纪人(也就是代理),才能去访问。其实就是给一个对象提供一个代理,如果要访问这个对象必须经过这个代理,先说,这个模式的优点是什么。 阅读详情

代理模式

昨天是第一次投简历后,第一次接到了电话面试,然后发现对几个知识点还是挺模糊的,所以打算写几篇博客来加深一下理解

本文内容
  1. 什么是代理模式
  2. 静态代理
  3. 动态代理
  4. 与其他的类似的设计模式的区别
什么是代理模式

先来一段百度的解释:

  • 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

就是为一个对象提供一个代理以控制对这个对象的访问,很容易理解,举个例子,我们想要邀请小明表演节目,必须先要通过他的经纪人,再让他的经纪人去和他沟通,在这个流程里面,小明就是被代理对象,经纪人就是他的代理对象,这样的好处是什么呢,好处就在于小明只需要在指定时间,指定地点参加表演,而其他的比如什么时候,什么地点,这些都交给经纪人去处理,所以在代码层面来说,就是可以在被代理对象的基础上,实现功能的扩展和业务的控制

代理模式根据代理类创建的时期,分为静态代理,动态代理

静态代理

静态代理,是指程序运行之前,代理类就已经被程序员写好,这种是最简单的代理模式,举个例子,当我写了一个接口IA,然后我再写一个被代理类A,再写一个PA,然后写main方法,然后运行,这种在运行之前,代理类就已经写好的,就是静态代理,上代码

  1. 先创建一个接口
/**
 * 
 * @author Dong
 *
 */
public interface ApplicationSoftware {
	public void mehtod();
}

  1. 再创建这个接口的子类作为被代理类
/**
 * 
 * @author Dong
 *
 */
public class Software implements ApplicationSoftware {
	
	private String name;
	
	public Software(String name) {
		this.name = name;
	}

	@Override
	public void mehtod() {
		System.out.println("我是" + name);
	}
}


  1. 再创建这个接口的另一个子类,作为代理类
/**
 * 
 * @author Dong
 *
 */
public class SoftwareProxy implements ApplicationSoftware {
	
	private ApplicationSoftware applicationSoftware;
	private String name;
	
	public SoftwareProxy(String name) {
		this.name = name;
	}
	
	@Override
	public void mehtod() {
		if(applicationSoftware == null){
			applicationSoftware = new Software(name);
		}
		System.out.println("我是代理");
		applicationSoftware.mehtod();
	}
}

  1. 编写main方法
/**
 * 
 * @author Dong
 *
 */
public class Test {

	public static void main(String[] args) {
		ApplicationSoftware applicationSoftware = new SoftwareProxy("idea");
		applicationSoftware.mehtod();
	}

}

代码已经很简单了,完全没有需要解释的地方,再展示一下结果
在这里插入图片描述

从代码中可以看出,静态代理可以做到,在符合开闭原则的前提下,实现对代理类的功能扩展,但是缺点是,如果存在多个被代理类,就需要对应的写多个代理类,工作量很大,而且接口一旦更改,那么所有的子类都需要做对应的更改,十分不方便

所以为了解决这些问题,就出现了动态代理

动态代理

动态代理,是指我们不需要再手动的去写代理类,而是让jvm,在程序运行的时候,动态的创建代理对象(注意:不再是创建代理类了,而是直接创建代理对象),他和静态代理相比,就是代理对象可以不实现接口,可能不是很容易理解,等会用代码来解释,在上代码之前,需要知道,实现动态代理的两种方式,利用JDK中自带生成代理类的API,利用Cglib代理

  1. JDK中自带生成代理类的API

JDK实现代理,首先需要我们自己创建动态处理器,然后使用newProxyInstance方法获取代理对象,该方法有三个参数,第一个参数是指定被代理对象所使用的类加载器,获取加载器的方法是固定的,第二个参数是指定被代理对象实现的接口的类型,使用泛型方式确认类型,是一个数组,因为一个类可以实现多个接口嘛,第三个参数是我们自己创建的动态处理器,在执行被代理对象的方法时,会触发动态处理器里面的方法

因为这种方式实现动态代理,是使用了java的反射机制,所以有两个要求,一就是被代理对象必须要实现接口,二就是代理对象必须要指定接口类型,否则无法实现动态代理,下面上代码

首先,还是上面的例子,接口和被代理类不变,我们创建一个动态处理器

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 
 * @author Dong
 *
 */
public class ProxyHandler implements InvocationHandler {

	// 被代理对象
    private Object object;

    public ProxyHandler(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理开始");
        Object result = method.invoke(object, args);
        System.out.println("动态代理结束");
        return result;
    }
}

接下来不再使用我们之前创建的静态代理类,修改main方法

import java.lang.reflect.Proxy;

/**
 * 
 * @author Dong
 *
 */
public class Test {

	public static void main(String[] args) {
		ApplicationSoftware as = (ApplicationSoftware) Proxy.newProxyInstance(Test.class.getClassLoader(),
				new Class[]{ApplicationSoftware.class}, 
				new ProxyHandler(new Software("idea")));
		as.mehtod();
	}

}

结果
在这里插入图片描述

这就是利用JDK中自带生成代理类的API的动态代理了,主要通过java的反射机制,拦截被代理类的方法,然后对拦截的方法进行控制,从而生成代理对象,可以看到,在动态处理器里面,被代理类使用的Object类,这样的话可以使得程序更灵活,可以处理各种被代理类

和静态代理相比,这种方式是不再需要创建多个代理类了,同时也降低了程序的耦合,已经基本上解决了我们的问题,但是美中不足的是,被代理类还是需要实现接口才能使用这个方式,那么还有没有更强大的方式呢,Cglib可以做到

  1. Cglib代理

对于没有实现接口的单一对象,我们要对其实现代理,可以从其子类入手,Cglib就是通过底层字节码,为被代理类创建一个子类,从而实现对被代理类的功能扩展,但是因为使用的继承,所以对final修饰的类,和private修饰的方法,不能进行代理

使用Cglib之前,需要先导包,需要导入

  • asm
  • asm-commons
  • asm-util
  • cglib-nodep

这个在maven上去下载吧,我就不提供了,毕竟用的不多

maven仓库网址:mvnrepository.com

下面上代码
首先修改被代理类

/**
 * 
 * @author Dong
 *
 */
public class Software{
	
	private String name;
	
	public Software(String name) {
		this.name = name;
	}
	
	public Software(){
		
	}

	public void mehtod() {
		System.out.println("我是" + name);
	}

}

然后编写Cglib代理类

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 
 * @author Dong
 *
 */
public class CglibProxy implements MethodInterceptor  {

	// 被代理类
	private Object object;

	/**
	 * 获取代理对象
	 * @return
	 */
	public Object getProxyInstance(Object object){
		this.object = object;
		Enhancer en = new Enhancer();
		en.setSuperclass(object.getClass());
		en.setCallback(this);
		return en.create();
	}

	@Override
	public Object intercept(Object object, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("动态代理开始");
        Object result = method.invoke(this.object, args);
        System.out.println("动态代理结束");
        return result;
	}

}

修改main方法

/**
 * 
 * @author Dong
 *
 */
public class Test {

	public static void main(String[] args) {
		Software software = (Software) new CglibProxy().getProxyInstance(new Software("idea"));
		software.mehtod();
	}

}

需要注意的地方是,在被代理类里面,我加上了一个无参的构造方法,原因是在return en.create(); 这个地方我没有传递参数,这句话的意思是创建被代理类的子类对象,然后返回,如果父类的构造方法需要参数,那么就需要传递参数,否则会出错,所以为了方便就直接提供一个无参的构造方法

然后对于被代理的拦截处理都是一样的操作,所以就没有再截结果的图了

可以看出,Cglib弥补了使用JDK自带的API的不足的地方,对于没有实现接口的类也可以进行动态代理,而且性能也更高,但是Cglib创建代理对象也要比JDK的更费事,二者各有所长,在Spring-AOP中就是使用了这两种方式结合

与其他的类似的设计模式的区别

再来说一下和别的类似的设计模式的区别,代理模式属于结构型模式,那么在结构型模式里面,适配器模式和装饰者模式是和代理模式最相似的,都是通过一个中间类,来间接访问目标类,但是区别在于

  1. 和适配器模式相比,适配器模式的主要作用就是把,由于接口不兼容而不能一起工作的那些类可以在一起工作,所以他的重点是转换,适配,而代理模式是不能改变所代理类的接口的
  2. 和装饰者模式相比,装饰者模式的主要作用是动态地给一个对象添加一些额外的职责,所以他的重点是添加功能,而代理模式除了添加功能,更多的是为了控制,控制对被代理类的访问

所以对于全部的23种设计模式,有很多的实现方式是很相似的,除了创建型,结构型,行为型三个大类很容易区分,大部分是很相似的,只有根据设计模式的原本作用去区分

总结
  • 对于代理模式的理解算是更上一层楼了,感觉自己以前的理解都只停留在静态代理的层面上,代理模式很好的诠释了开闭原则,在不破坏封装的前提下,实现对功能的扩展与控制
  • 代理模式是Spring-AOP的核心,而动态代理又是代理模式的核心,所以掌握了动态代理模式很重要,当然别的设计模式也都很重要
  • 对于面试经验系列的,还是要持续更新,毕竟每次面试都能发现自己不足的地方,写博客加深印象,争取让自己变得更强
  • 最后推荐两个我查的博客,写的挺好的,有一定的借鉴

https://www.cnblogs.com/cenyu/p/6289209.html
https://www.cnblogs.com/daniels/p/8242592.html

Win10管理员权限的‘暗门’:从mmc.exe被阻止,聊聊UAC与自动提权那些事儿 本文深入解析Windows 10中UAC(用户账户控制)与自动提权机制,探讨mmc.exe被阻止的深层原因及解决方案。从UAC工作原理到自动提权机制,再到具体诊断与修复步骤,帮助用户理解并解决权限管理问题,同时平衡安全性与便利性。 阅读详情

相关推荐

股票交易接口TDX量化下单接口

对于需要同时操作多只股票的投资者而言,这一功能可以一次性处理多个交易指令,大大提高了交易的效率。通过回测,投资者可以发现策略中的不足之处,进而进行优化和调整,提高策略的可靠性。根据通达信提供的安装指南,下载相应的安装程序并进行安装。这包括设置交易账户的相关信息,如账户名、密码等,以及连接到正确的交易服务器。不同的情况可能会有不同的标准,有的可能要求账户使用达到一定的时长,有的可能对账户内的资产金额有最低要求。可以通过接口提供的监控功能或者第三方工具,实时查看交易状态、交易数据等信息,确保交易按照预期进行。

2401_88470113的博客 1287

面试总结day8:动态代理

首先有一个被增强的类,然后有一个增强的方法,在一个方法中在这个被增强类的前后调用增强方法.

SLSLSLSLSLSLS的博客 251

从零开始:Ubuntu 24.04 LTS + Win11双系统安装教程

本文将简单直白介绍如何从零开始在同一台电脑上安装 Ubuntu 24.04 LTS 和 Windows 11,你可以在需要进行专业开发或运维工作时,轻松切换到 Ubuntu,享受其带来的高效与自由;而在日常学习生活和娱乐休闲时,依然可以无缝使用熟悉的 Windows 环境。

萑澈的博客 8101

从原理到实践:代理模式如何在项目中落地详解(设置代理控制访问原对象)

其中,抽象角色定义了代理对象和被代理对象的公共接口,代理角色实现了抽象角色,并持有一个指向被代理对象的引用。通过代理角色来调用被代理对象的方法,实际上是调用了被代理对象的方法,并可以在执行前后添加一些额外的操作,如日志记录、性能监控等。代理对象与被代理对象具有相同的接口,因此可以在任何时候替换原始对象,并且可以通过代理对象来实现对原始对象的访问控制和管理。总之,Java代理模式通过代理对象实现了对被代理对象的控制和管理,提高了程序的可维护性和安全性,在软件开发中具有广泛的应用。

Hanko的专栏 274

告别手动维护!教你用SAP BAPI批量更新生产订单BOM组件(CO02工单)

本文详细介绍了如何利用SAP BAPI实现生产订单BOM组件的批量更新,解决传统手工操作(如CO02工单)效率低下的问题。通过核心函数解析和批量处理框架设计,帮助用户大幅提升工作效率,降低错误率,适用于物料主数据变更、季节性配方调整等场景。

weixin_30844577的博客 558

Silvaco TCAD仿真例库——肖特基二极管反向击穿特性(案例)

本文详细介绍了使用Silvaco TCAD仿真例库分析肖特基二极管反向击穿特性的完整流程。通过搭建带保护环的器件结构,配置关键物理模型,并执行反向偏压扫描,深入探讨了雪崩击穿机制、电场分布及设计参数(如漂移区浓度、保护环)对击穿电压的影响,为功率半导体设计与可靠性分析提供了实用的虚拟实验方法。

weixin_29165465的博客 388

【Java】基础面试题

【Java】基础面试题

学无止境 574

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7103

【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

概念:代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。优点:(1)职责清晰真实的角色就是实现实际的业务逻,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。(2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。(3)高扩展性。

m0_63372226的博客 842

Vivado实战:从零封装AXI-Lite接口的呼吸灯IP核

本文提供了一份详细的Vivado实战指南,手把手教你如何将Verilog编写的呼吸灯模块封装成带AXI-Lite接口的IP核。内容涵盖从创建IP框架、编写核心逻辑、连接AXI总线到在ZYNQ系统中调用并编写C程序进行软硬件协同测试的完整流程,是掌握FPGA软硬件协同设计的关键实践。

weixin_29233333的博客 594

Zynq UltraScale+ MPSoC-AMP(linux+裸机)

接着 Zynq UltraScale+ MPSoC-双核裸机AMP继续 平台工具:zcu106,vitis2020.2,petalinux2019.2 文章目录1.cpu1跑裸机2.cpu0跑linux2.1petalinux设置2.2 app3.生成BOOT.bin4.zcu106测试 1.cpu1跑裸机 参照Zynq UltraScale+ MPSoC-双核裸机AMP建立的工程进行修改。BSP中stdin与out修改为uart1,uart1给裸机用,uart0给linux用。 ddr空间裸机与linu

zhuxl24的博客 5195

关于动态代理在面试中的一些问题

关于动态代理在面试中的一些问题

weixin_53700782的博客 521

LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟

我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。

Ceshigo_CD的博客 4836

代理模式(ProxyPattern)

代理模式(ProxyPattern) 代理模式 为其他对象提供一种代理以控制对这个对象的访问 远程代理,也就是为一个对象在不同的地址控件提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实 虚拟代理,根据需要创建开销很大的对象,通过他来存储实例化需要很长时间的真是对象 安全代理 用来控制真实对象访问时的权限 智能指引 指当调用真实的对象时,代理处理另外一些事情 模式动机 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户

Sharker_Blog的博客 583

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式之代理模式ProxyPattern(六)

1、什么是代理模式?代理模式是23种设计模式中的一种。代理模式是一种结构型设计模式,它允许为其他对象提供一个替代品或占位符,以控制对这个对象的访问。2、代理模式的角色构成抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样代理类可以通过实现该接口来代理真实主题。真实主题(Real Subject):定义了代理所代表的真实对象。代理(Proxy):持有对真实主题的引用,并实现了与真实主题一样的接口,客户端通过代理来访问真实主题,同时可以在访问真实主题前后进行一些额外操作。

徐泗空的博客 1460

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

代理模式 (ProxyPattern)

文章目录代理模式 (ProxyPattern)代理模式的定义代理模式的优点代理模式的缺点代理模式的结构代理模式的实现普通代理强制代理动态代理AOP使用场景 代理模式 (ProxyPattern) 代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的优点 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。 具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完

有问题的请私信或关注v【技术印记】留言 412

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计模式之代理模式(ProxyPattern)

设计模式之代理模式(ProxyPattern) 文章目录设计模式之代理模式(ProxyPattern)一.代理模式(ProxyPattern)二.编程实例1.图片读取案例2.String类访问修饰符[]读写操作区分案例 一.代理模式(ProxyPattern) 代理模式是创建一个代理类,来帮助我们处理真实类,一般来说,这种代理类有点像明星的经纪人,如果你想接触到明星,必须先和他们的经纪人打交道。...

Worthy_Wang的博客 476

代理模式-ProxyPattern

前言: 代理模式与装饰者模式: 相同点: 1. 前提条件:装饰者(代理者)与被装饰者(委托者)要继承相同的父类或实现相同的接口。 2. 都可以增强某个类的方法,对程序进行扩展。 不同点: 1. 代理者是为某个对象添加一个代理,以控制对这个对象的访问。而装饰者增强某个类的方法。 2. 代理可以在调用核心方法之前做前置处理...

Jason Blog 197

代理模式(ProxyPattern)

定义 通过一个代理对象或者占位符来控制对原对象的访问。 结构图 角色与理解 代理模式共分为四种角色: Subject(抽象主题角色):真实主题角色与代理主题角色的共同父类,可以是具体类、抽象类、接口,客户端针对抽象主题角色编程 RealSubject(真实主题角色):实现具体业务方法的类,被代理主题角色调用 Proxy(代理主题角色):持有真实主题角色的引用,在调用真实主题角色的具体业务方法之前或者之后添加其它操作 客户端面对抽象主题角色编程,调用抽象主题角色实际上调用的是代

码农架构 421

java设计模式之 代理模式【Proxy Pattern】 详解

首先我们举个例子说明一下什么是策略模式: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代理的人能干活呀。 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的: 先定义一种类型的女人: package com.cbf4lif...

蛋蛋淡淡定的庄园 299

代理模式(proxyPattern)

定义  为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理模式可以在客户端与目标对象之间起到中介的作用。分类  1.静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。  2.动态代理:在程序运行时,运用反射机制动态创建而程。UML...

zz_ddup的博客 221

结构型模型之-代理模式(proxyPattern)

结构型模型之-代理模式(proxyPattern) 参考网址:https://www.runoob.com/design-pattern/proxy-pattern.html 1 代理模式简介 代理模式主要是用中间层控制原生对象的访问 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。 2 代理模式图解 3 代理模式简单实现 3.1 代码组成类 Image ProxyImage RealImage TestProxy 3.2 具体代码 Image package com.sh

shufangreal的博客 331

第6章 代理模式【ProxyPattern】

静态代理的目标对象和代理对象需要实现统一个接口或者继承相同的父类。JDK动态代理的代理对象不需要实现接口,但是目标对象需要实现接口。

qq_41846002的博客 423
上一篇: MapReduce编程: 3. 航班数据按月份升序,星期降序排列
下一篇: 关于数据库的事务和索引(一)
ye_xiao_dong
博客等级 码龄9年 28粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值