一文读懂Java中的设计模式——代理模式,以翻译场景举例,特别通俗易懂!

代理模式概念

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。目的:为其他对象提供一种代理以控制对这个对象的访问。

代理模式类关系图

代理模式代码实现

这里举一个非常通俗易懂的翻译的例子,首先定义一个接口ITalk,用来说话

public interface ITalk {
	
	void talk();
	

}

默认我们中国人是说汉语的

public class TalkChinese implements ITalk{

	@Override
	public void talk() {
		System.out.println("默认中文交流");
		
	}

}

此时我们需要跟英国人沟通,怎么办?最简单的方法就是先找一个英语翻译,然后我们说汉语,让这个翻译进行翻译工作,代码如下,在EnglishProxy 中的talk方法里并没有更改TalkChinese类中的talk()方法,只是在其前后加了一些新需求而已!

public class EnglishProxy implements ITalk {
	
	private ITalk vtalk=new TalkChinese();

	@Override
	public void talk() {
		// TODO Auto-generated method stub
		
		System.out.println("找一个会汉语和英语的翻译" );
		 
		vtalk.talk();
		
		System.out.println("翻译把汉语翻译成英语" );
		
	}

}

如果又有一个需求,需要跟法国人沟通,怎么办?方法同上


public class FrenchProxy implements ITalk {
	
	private ITalk vtalk=new TalkChinese();

	@Override
	public void talk() {
		// TODO Auto-generated method stub
		
		System.out.println("找一个会汉语和法语的翻译" );
		 
		vtalk.talk();
		
		System.out.println("翻译把汉语翻译成法语" );
	 
		
	}

}

最后写一个测试类

public class TestProxcy {

	public static void main(String[] args) {
		
		
		EnglishProxy ep=new EnglishProxy();
		ep.talk();
			
		FrenchProxy fp=new FrenchProxy();
		fp.talk();
		

	}

}

运行代码输出如下:

找一个会汉语和英语的翻译
默认中文交流
翻译把汉语翻译成英语
找一个会汉语和法语的翻译
默认中文交流
翻译把汉语翻译成法语

从上面的代码中可以看到静态代理的本质:由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。 但是静态代理的缺点也很明显,在程序规模稍大时,维护代理类的成本高,静态代理无法胜任!怎么办?通过动态代理实现,后续我会继续讲解!

如果你始终不理解Java动态代理的设计目的,建议您来看看!-CSDN博客

了解过AOP的同学看到这里会不会发现,代理设计模式不就是AOP的核心设计思想吗?关于aop大家可以参考下面的文章

测试同学上手Spring 之AOP最易懂的解析_自动化测试框架spring aop-CSDN博客

一句话总结代理模式

代理模式就是代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!

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

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

相关文章

浅谈Guava Cache的参数使用

CacheLoader 用于数据加载方式比较固定且统一的场景,在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…

论文阅读——llava

Visual Instruction Tuning LLaVA 指令智能体分为两类:端到端的,通过LangChain[1]/LLM[35]协调各种模型的系统。 数据集生成用GPT辅助生成的,具体不写了。 模型结构: input image Xv LLM:Vicuna visual encoder&a…

芯片到底是怎么访问外设

微型计算机的组成:CPURAM硬盘等 什么是FLASH? FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NV…

系列一、GitHub搜索技巧

一、GitHub搜索技巧 1.1、概述 作为程序员,GitHub大家应该都再熟悉不过了,很多时候当我们需要使用某一项技能而又无从下手时,通常会在百度(面向百度编程)或者在GitHub上通过关键字寻找相关案例,比如我想学…

nodejs+vue+ElementUi医院预约挂号系统3e3g0

本医院预约挂号系统有管理员,医生和用户。该系统将采用B/S结构模式,使用Vue和ElementUI框架搭建前端页面,后端使用Nodejs来搭建服务器,并使用MySQL,通过axios完成前后端的交互 管理员功能有个人中心,用户管…

springMVC-异常处理

一、四种异常形式 在springmvc中,处理异常有四种形式 1.局部异常 2.全局异常 3.自定义异常 4.统一异常(统一提示异常) 作用:可以使浏览器不出现丑陋的500错误提示,而跳转到另外的错误提示页面 另外,自定义…

Linux——缓冲区

我在上篇博客留下了一个问题,那个问题就是关于缓冲区的问题,我们发现 文件有缓冲区,语言有用户级缓冲区,那么缓冲区到底是什么?,或者该怎 么认识缓冲区?这篇文章或许会让你有所认识,…

【ONE·MySQL || 基础介绍】

总言 主要内容:MySQL在Centos 7下的安装(主要学习相关指令语句,理解安装操作是在做什么)、对MySQL数据库有一个基础认识。 文章目录 总言0、MySQL的安装与卸载(Centos 7)0.1、MySQL的卸载0.1.1、卸载不必要…

MySQL数据库 触发器

目录 触发器概述 语法 案例 触发器概述 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的soL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录&am…

XUbuntu22.04之跨平台音频编辑工具(平替Audition):ocenaudio(二百零二)

加粗样式 简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏&#…

FastDDS编译

Windows installation from binaries download 里面有二级菜单 view 安装后切换至目录 C:\Program Files\eProsima\fastrtps 2.12.1\examples\cpp\dds cmd打开此目录 mkdir build cd build cmake … //cmake …可以换成下面这句,这是官网的推荐 cmake -Bbuilde…

nn.LSTM个人记录

简介 nn.LSTM参数 torch.nn.lstm(input_size, "输入的嵌入向量维度,例如每个单词用50维向量表示,input_size就是50"hidden_size, "隐藏层节点数量,也是输出的嵌入向量维度"num_layers, "lstm 隐层的层数,默认…

R语言中使用ggplot2绘制散点图箱线图,附加显著性检验

散点图可以直观反映数据的分布,箱线图可以展示均值等关键统计量,二者结合能够清晰呈现数据蕴含的信息。 本篇笔记主要内容:介绍R语言中绘制箱线图和散点图的方法,以及二者结合展示教程,添加差异比较显著性分析&#xf…

[Angular] 笔记 6:ngStyle

ngStyle 指令: 用于更新 HTML 元素的样式。设置一个或多个样式属性&#xff0c;用以冒号分隔的键值对指定。键是样式名称&#xff0c;带有可选的 .<unit> 后缀&#xff08;如 ‘top.px’、‘font-style.em’&#xff09;&#xff0c;值为待求值的表达式&#xff0c;得到…

KingbaseV8R6单实例定时全量备份步骤

此场景为单机数据库节点内部备份&#xff0c;方便部署和操作&#xff0c;但备份REPO与数据库实例处于同一个物理主机&#xff0c;冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中&#xff0c;经常用到ksql工具登录数据库&#xff0c;本地免密登录…

钓鱼与木马实践(仅供参考不可实践)

声明:内容仅供学习&#xff0c;请勿违法使用&#xff0c;违者后果自负 一.部署云服务器 购买一台云服务器,Windows&#xff08; 中文 &#xff09;版本即可 华为云官网&#xff1a;https://www.huaweicloud.com/ 登录后进入控制台购买完成后远程登录云服务器 二.部署WEB运行…

Zookeeper的学习笔记

Zookeeper概念 Zookeeper是一个树形目录服务&#xff0c;简称zk。 Zookeeper是一个分布式的、开源的分布式应用程序的协调服务 Zookeeper提供主要的功能包括&#xff1a;配置管理&#xff0c;分布式锁&#xff0c;集群管理 Zookeeper命令操作 zk数据模型 zk中的每一个节点…

springMVC-自定义拦截器

一、先来看一个需求 Spring MVC也可以使用拦截器对请求进行拦截处理&#xff0c;用户可以自定义拦截器来实现特定的功能&#xff0c;比如对临时文件的清除&#xff0c;或者对某些ip地址进行拦截器. 二、springMVC自定义拦截器介绍 (1)需要实现一个接口 HandlerInterceptor. (…

大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

Stable-diffusion-webui本地部署和简要介绍

Stable Diffusion 是一款基于人工智能技术开发的绘画软件&#xff0c;它可以帮助艺术家和设计师快速创建高品质的数字艺术作品。是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;同时也可以应用于其他任务&#xff0c;如内补绘制、…