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

news2024/12/23 9:49:43

代理模式概念

在代理模式(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博客

一句话总结代理模式

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBase基础知识(二):HBase集群部署、HBaseShell操作

1. HBase安装部署 1.1 Zookeeper正常部署 首先保证Zookeeper集群的正常部署,并启动之: 创建集群启动脚本: #!/bin/bash case $1 in "start"){ for i in hadoop100 hadoop101 hadoop102 do echo----------zookeeper $i 启动----…

TKEStack容器管理平台实战之部署wordpress应用

TKEStack容器管理平台实战之部署wordpress应用 一、TKEStack介绍1.1 TKEStack简介1.2 TKEStack特点1.3 TKEStack架构图 二、kubernetes集群介绍2.1 k8s简介2.2 k8s架构图 三、本次实践介绍3.1 实践环境要求3.2 本次实践环境规划3.3 本次实践简介 四、安装容器管理平台4.1 安装T…

python基础-检测字符串是否含有中文的方法

1. 正则表达式 代码示例如下: import re def contains_chinese(text):pattern re.compile(r[\u4e00-\u9fff]) # 匹配中文字符的正则表达式范围return bool(pattern.search(text))2.unicodedata模块 import unicodedata def contains_chinese(text):for char in…

Codeforces Round 638 (Div. 2)B. Phoenix and Beauty(思维构造)

B. Phoenix and Beauty 这道题目学到的东西: 从给出的数据范围观察,得到一些有用信息(峰哥教的)考虑无解的情况‘ 其实这题考虑怎么操作是比较难的,如果能想出来满足条件的结果就比较好了(我在说什么我自…

力扣题:高精度运算-1.1

力扣题-1.1 [力扣刷题攻略] Re:从零开始的力扣刷题生活 力扣题1:67. 二进制求和 解题思想:将数组进行遍历相加即可 class Solution(object):def addBinary(self, a, b):""":type a: str:type b: str:rtype: str""…

java开发面试:常见业务场景之单点登录SSO(JWT)、权限认证、上传数据的安全性的控制、项目中遇到的问题、日志采集(ELK)、快速定位系统的瓶颈

单点登录(SSO) 单点登录,Single Sign On(简称SSO),只需要登录一次,就可以访问所有信任的应用系统。 如果是单个tomcat服务,session可以共享,如果是多个tomcat,那么服务s…

count(*)、count(1)、count(column)的区别

count(*)、count(1)、count(column)的区别 count(*): 返回检索到的行数,无论是否含有NULL值,在InnoDB下,仅计算当前事务可见的行,通过遍历最小的可用二级索引来处理count(*),除非索引或优化器指示优化器使…

阿里云林立翔:基于阿里云 GPU 的 AIGC 小规模训练优化方案

云布道师 本篇文章围绕生成式 AI 技术栈、生成式 AI 微调训练和性能分析、ECS GPU 实例为生成式 AI 提供算力保障、应用场景案例等相关话题展开。 生成式 AI 技术栈介绍 1、生成式 AI 爆发的历程 在 2022 年的下半年,业界迎来了生成式 AI 的全面爆发&#xff0c…

深信服技术认证“SCSA-S”划重点:命令执行漏洞

为帮助大家更加系统化地学习网络安全知识,以及更高效地通过深信服安全服务认证工程师考核,深信服特别推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚

目录 一、实验 1. 环境 2. K8S master节点部署Argo CD 3.基于ArgoCD 实现GitOps (同步部署文件) 4.基于ArgoCD 实现GitOps (同步HELM文件) 二、问题 1. ArgoCD 连接K8S集群状态为 Unknown 2.ArgoCD 创建application失败 …

华为全屋wifi6蜂鸟套装标准

华为政企42 华为政企 目录 上一篇华为安防监控摄像头下一篇华为企业级无线路由器

Layui 2.9.2 列表商品展示页 用模板引擎 laytpl Ajax 读取json 数据 筛选数组 filter css 限制文体显示过长用。。。代替

全代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>软件管理器</title><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compatible" conten…

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络

文献速递&#xff1a;生成对抗网络医学影像中的应用—— CG-3DSRGAN&#xff1a;用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络&#xff08;Generative adversarial networks, GANs&#xff09;在医学影像中的应用。文献…

大数据技术基础-读书笔记

大数据技术基础-读书笔记 一、大数据概述 大数据是指在一定时间内无法用常规软件工具对其内容进行抓取、处理、分析和管理的数据集合。 大数据一般会涉及两种以上的数据形式&#xff0c;数据量通常是100TB以上的高速、实时数据流&#xff0c;或者从每年增长速度快的小数据开…

Java小案例-Java实现人事管理系统

前言 《人事管理系统》该项目采用技术jsp、Struts2、Mybatis、dwr、tomcat服务器、mysql数据库 开发工具eclipse/idea。 【项目使用技术】 Struts2Mybatisdwrjqueryjscss等技术 前端使用技术&#xff1a;JSP, dwr、jquery、js、css等 后端使用技术&#xff1a;Struts2Myba…

Leetcode—73.矩阵置零【中等】

2023每日刷题&#xff08;六十六&#xff09; Leetcode—73.矩阵置零 空间复杂度为O(mn)版实现代码 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int rowLen matrix.size();int colLen matrix[0].size();vector<int> row…

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好&#xff0c;但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时&#xff0c;我可能脆弱得一句话就泪流满面&#xff1b;有时&#xff0c;也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite Vue3 TS E…

Linux环境安装Hadoop

&#xff08;1&#xff09;下载Hadoop安装包并上传 下载Hadoop安装包到本地&#xff0c;并导入到Linux服务器的/opt/software路径下 &#xff08;2&#xff09;解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…

Spring Boot集成RocketMQ之消息对象序列化

以下源码基于rocketmq-spring-boot-start 2.1.1版本&#xff0c;其它版本可能会有差异 一. 前言 当我们在Spring Boot项目中集成RocketMQ后&#xff0c;只需要在配置文件(application.yml)中添加rocketmq的相关配置&#xff0c;即可使用rocketMQTemplate发送对象消息。登录Ro…

PDF文件如何设置限制打印?

想要限制PDF文件的打印功能&#xff0c;想要限制PDF文件打印清晰度&#xff0c;都可以通过设置限制编辑来达到目的。 打开PDF编辑器&#xff0c;找到设置限制编辑的界面&#xff0c;切换到加密状态&#xff0c;然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…