一文读懂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博客

一句话总结代理模式

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

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

相关推荐
JH30738 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_9 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble10 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟10 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖10 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_124987075311 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_11 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.11 小时前
Day06——权限认证-项目集成
java
瑶山11 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy12 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法