设计模式(三)代理模式

目录

一、什么是代理模式

二、静态代理

1、定义

2、代码

2.1、接口

2.2、被代理对象

 2.3、代理对象

 2.4、测试

三、动态代理

1、定义

2、代码

 2.1、接口

2.2、目标对象

 2.3、代理对象

 2.4、测试


一、什么是代理模式

代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

在生活中的例子也非常多,例如你不好意思向你关系不太好朋友帮个忙,这时需要找一个和它关系好的应一个朋友帮忙转达,这个中间朋友就是代理对象。例如购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。

代理模式主要有三种形式,分别是静态代理动态代理(也称JDK代理、接口代理)和cglib代理(在内存动态创建对象而不需要实现接口,也可属于动态代理的范畴)

二、静态代理

1、定义

静态代理是定义父类或者接口,然后被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。代理对象与目标对象实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。

  • 优点:可不修改目标对象的功能,通过代理对象对目标功能扩展。
  • 缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,一旦接口增加方法,目标对象与代理对象都要维护

比如老师代课的案例:

  • ITeacherDao:接口
  • TeacherDao:目标对象,实现接口ITeacherDao
  • TeacherDAOProxy:代理对象,也实现ITeacherDao接口,并且聚合ITeacherDao属性,通过构造器传参设置值,调用的时候通过调用代理对象的方法来调用目标对象。

2、代码

2.1、接口

public interface ITeacherDao {
	void teach(); // 授课的方法
}

2.2、被代理对象

public class TeacherDao implements ITeacherDao {
	@Override
	public void teach() {
		System.out.println("一键三连");
	}
}

 2.3、代理对象

public class TeacherDaoProxy implements ITeacherDao {
	private ITeacherDao target; //通过接口聚合目标对象
	public TeacherDaoProxy(ITeacherDao target) {
		this.target = target;
	}
	@Override
	public void teach() { //重写接口
		System.out.println("静态代理开始");
		target.teach();
		System.out.println("静态代理结束");
	}
}

 2.4、测试

public class Client {
	public static void main(String[] args) {
		//创建被代理对象
		TeacherDao teacherDao = new TeacherDao();

		//创建代理对象, 同时将被代理对象传递给代理对象
		TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);

		//通过代理对象,调用到被代理对象的方法
		teacherDaoProxy.teach();
	}
}

三、动态代理

1、定义

动态代理也叫JDK代理、接口代理。它使代理对象不需要实现接口(但目标对象要实现接口),代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。

即使用JDK包java.lang.reflect.Proxy中的newProxyInstance方法来动态的创建目标对象(被代理对象),该方法需要如下接收三个参数:

1)ClassLoader loader
指定当前目标对象使用的类加载器
2)Class<?>[] interfaces
目标对象实现的接口类型,使用泛型方法确认类型
3)InvocationHandler h
事情处理,执行目标对象的方法时,会触发事情处理器方法,把当前执行的目标对象方法作为参数传入

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

类图:

核心是getProxyInstacne()

1)根据传入的对象TeacherDao目标对象

2)利用返回机制,返回一个代理对象

3)然后通过代理对象,调用目标对象方法

2、代码

 2.1、接口

public interface ITeacherDao {
	void teach();
	void tesst(String name);
}

2.2、目标对象

public class TeacherDao implements ITeacherDao {
	@Override
	public void teach() {
		System.out.println("一键三连");
	}
	@Override
	public void tesst(String name) {
		System.out.println("传参测试:" + name);
	}
}

 2.3、代理对象

public class ProxyFactory {
	//维护一个目标对象 , Object
	private Object target;
	//构造器 , 对target 进行初始化
	public ProxyFactory(Object target) {
		this.target = target;
	}
	//动态生成一个代理对象
	public Object getProxyInstance() {
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new InvocationHandler() { //匿名类重写invoke方法
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("动态代理开始");
						Object returnVal = method.invoke(target, args);//反射机制调用目标对象的方法
						System.out.println("动态代理结束");
						return returnVal;
					}
				});
	}
}

 2.4、测试

public class Client {
	public static void main(String[] args) {
		//创建目标对象
		ITeacherDao target = new TeacherDao();

		//创建代理对象
		ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();

		//内存中动态生成了代理对象
		System.out.println(proxyInstance.getClass());

		//通过代理对象,调用目标对象的方法
		proxyInstance.teach();
		proxyInstance.tesst("一键三连");
	}
}

 运行结果:

参考:https://blog.csdn.net/qq_45034708/article/details/115030032

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

注塑件检测视觉检测中可能遇到的外观缺陷

机器视觉检测注塑件不良特征有哪些&#xff1f;按照检测需求一般分为两类&#xff1a;外观缺陷和尺寸缺陷。但由于注塑件的工艺特点及原材料特性&#xff0c;注塑件外观缺陷在生产过程中出现的概率于频率远远大于尺寸缺陷。 注塑件检测视觉检测中可能遇到的外观缺陷 1、色差&a…

CyberBattleSim-(内网自动化渗透)研究分析

01 背景知识介绍 CyberBattleSim介绍 CyberBattleSim是一款微软365 Defender团队开源的人工智能攻防对抗模拟工具&#xff0c;来源于微软的一个实验性研究项目。该项目专注于对网络攻击入侵后横向移动阶段进行威胁建模&#xff0c;用于研究在模拟抽象企业网络环境中运行的自动…

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置&#xff0c;就是这个B函数&#xff0c;嗯......听起来好像有点奇怪&#xff0c;但是它确实叫B啊&#xff0c;笑死。不管了&#xff0c;看一下里面的逻辑是啥。 注意e参数的内容是&#xff1a; {"app_name":…

Java基础之练习(2)

需求: 键盘录入一个字符串,使用程序实现在控制台遍历该字符串 package String;import java.util.Scanner;public class StringDemo5 {public static void main(String[] args) {//录入一个字符串Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串…

vue3 antdv RadioButton默认值选择问题处理

1、先上官方文档&#xff1a; Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 官方代码&#xff1a; <template><div><div><a-radio-group v-model:value"value1"><a-radio-button value"a…

网络编程5----初识http

1.1 请求和响应的格式 http协议和前边学过的传输层、网络层协议不同&#xff0c;它是“一问一答”形式的&#xff0c;所以要分为请求和响应两部分看待&#xff0c;同时&#xff0c;请求和响应的格式是不同的&#xff0c;我们来具体介绍一下。 1.1.1 请求 在介绍请求之前&…

助力数据跨境,最新政策解读与应用实践分享

6月13日&#xff0c;VERYCLOUD睿鸿股份联合深数所企业数据合规服务南山工作站、亚马逊云科技&#xff0c;在深圳南山区共同主办了一场关于《数据出境合规之路——法规解析与实践探索》研讨会。 VERYCLOUD睿鸿股份是南山大数据产业协会的副会长单位。南山大数据产业协会作为深圳…

C++代码编写风格:Header-Only与声明实现分离的选择

C代码编写风格&#xff1a;Header-Only与声明实现分离的选择 最近看到一些小伙伴问到了几个比较有趣的问题&#xff0c;这里总结一下&#xff0c;这些都是实际面试中出现过的问题&#xff0c;看看你知道多少&#xff0c;考察一下底子。 面试问题1&#xff1a;你通常编写代码的风…

实战!如何从零搭建10万级 QPS 大流量、高并发优惠券系统--图文解析

实战&#xff01;如何从零搭建10万级 QPS 大流量、高并发优惠券系统–图文解析 原文链接&#xff1a;https://juejin.cn/post/7087824893831544845 原文作者&#xff1a;字节跳动技术团队 需求背景 需要设计、开发一个能够支持十万级 QPS 的优惠券系统 什么是QPS? Queri…

集采商城,智能费控4.0的核心载体

纵观企业费控模式进化史&#xff0c;从1.0手工报销模式到2.0线上报销模式&#xff0c;再到3.0移动报销模式&#xff0c;企业对费用管控的模式与技术虽然在不断升级迭代&#xff0c;但始终没有将消费端纳入费控体系&#xff0c;难以形成完整链路和闭环。 智能费控4.0创新提出场景…

SpringBoot+Vue物流快递仓库管理系统

物流快递仓库管理是一项非常繁琐复杂的工作&#xff0c;每天要处理大量的单据数据&#xff0c;包括入库、出库、退库、调库等多项货物操作流程。因此&#xff0c;为提高库管工作的质量和效率&#xff0c;就必须根据仓库管理的特点开发库存物流信息系统。 本文立足于物流信息系…

基于大数据的计算机就业数据可视化分析项目

使用Python作为编程语言&#xff0c;配合MySQL数据库以及Hadoop和Spark等大数据处理工具&#xff0c;实现了数据的抓取、清洗、分析到可视化展示的整个流程。系统采用Scrapy爬虫框架从拉勾网招聘平台高效抓取计算机行业的就业数据。随后&#xff0c;通过Pandas库对数据进行了深…

三人同行免单模式:社交电商的新趋势

在当今社交电商日益繁荣的背景下&#xff0c;三人同行免单模式作为一种创新的购物激励机制&#xff0c;正逐渐受到消费者和品牌的青睐。该模式通过消费者之间的互动和分享&#xff0c;促进产品销售和品牌推广&#xff0c;实现消费者与品牌的双赢。 模式概述 三人同行免单模式的…

Bilibili开源发布轻量级 Index 系列语言模型:2.8T 训练数据,支持角色扮演

Bilibili首次发布 Index 系列模型中的轻量版本&#xff1a;Index-1.9B 系列 本次开源的 Index-1.9B系列包含以下模型&#xff1a; Index-1.9Bbase:基座模型&#xff0c;具有 19 亿 非词嵌入参数量&#xff0c;在 2.8T 中英文为主的语料上预训练&#xff0c;多个评测基准上与…

养猫的上班族还不买智能猫砂盆吗?自费测评好用合集来啦!

到底谁还在蹲点等下班然后冲回家给猫铲屎的&#xff1f;原来是以前的我啊&#xff0c;任劳任怨给猫铲屎&#xff0c;上完自己的班回家还要给猫上班&#xff0c;累死累活的真的受不了&#xff01;最后实在受不了&#xff0c;在网上看了各种智能猫砂盆的测评后果断购入&#xff0…

mysql中的lead函数和over函数

文章目录 mysql中的lead函数和over函数作用需求场景实现方法group by分组和使用over函数分组有什么区别&#xff1f; mysql中的lead函数和over函数 作用 over函数是用来分组加排序的&#xff0c;然后等over函数分好组排好序之后&#xff0c;再使用lead函数去找当前分组内的下…

JMeter详解

一、线程组 作用:线程组就是控制Imeter用于执行测试的一组用户 位置:右键点击测试计划’-->添加 -->线程(用户)--> 线程组 特点: 模拟多人操作线程组可以添加多个&#xff0c;多个线程组可以并行或串行取样器(请求)和逻辑控制器必须依赖线程组才能使用线程组下可以…

自动化测试:Autorunner的使用

自动化测试&#xff1a;Autorunner的使用 一、实验目的 1、掌握自动化测试脚本的概念。 2、初步掌握Autorunner的使用 二、Autorunner的简单使用 autoRunner使用方法 新建项目 a) 在项目管理器空白区域,右键鼠标,选择新建项目 b) 输入项目名后,点击[确定]. 在初次打开aut…

手机怎么自动切换ip地址

在数字化时代&#xff0c;网络IP地址不仅是设备在网络世界的标识&#xff0c;也是确保用户网络安全和数据隐私的关键因素。对于手机用户来说&#xff0c;在某些情境下可能需要自动切换IP地址&#xff0c;本文将为您介绍手机怎么自动切换IP地址。 随着网络技术的发展&#xff0c…

python项目(课设)——飞机大战小游戏项目源码(pygame)

主程序 import pygame from plane_sprites import * class PlaneGame: """ 游戏类 """ def __init__(self): print("游戏初始化") # 初始化字体模块 pygame.font.init() # 创建游戏…