当前位置:网站首页>结构型模式之代理模式
结构型模式之代理模式
2022-06-22 17:58:00 【OldZhangYH】
代理模式
一个对象A需要给某个对象B提供一个代理以控制对对象A的访问。这个时候访问对象C不适合或者不能直接引用目标对象,所以需要代理对象A作为一个访问对象C和被访问对象B的中介。(比如买电脑,我们都是从电脑城的经销商那里买,不可能直接从华硕的工厂拿货)。
代理模式分为两种:
- 静态代理:静态代理的代理类在程序的编译期间就生成了。
- 动态代理:动态代理的代理类在程序运行的时候才会动态的生成。
结构
- 抽象主题类(Subject):通过接口或者抽象类来声明真实主题和代理对象实现的业务逻辑。
- 真实主题类(Real Subject):实现了抽象主题类的方法,是代理对象所代表的真实对象,是最终被引用的对象
- 代理类(Proxy):提供了和真实主题相同的接口,内部有对真实主题的引用。可以访问、控制和扩展真实主题的功能
静态代理
电脑厂家华硕按照出厂价卖给经销商电脑城,然后电脑城扩展了这个卖的功能加价2000再卖给消费者。
动态代理
在动态代理的方式中,代理类是在程序运行的过程中自动生成的。因此我们是无法在文件中找到一个代表代理类的Java文件的。我们使用了一个ProxyFactory类来生成代理类。要注意ProxyFactory并不是代理类,而是一个用来生产代理类的工厂,真正的代理类只会在运行过程中在内存中产生。
JDK提供了Proxy类的newProxyInstance()方法来返回代理对象。这个方法有三个参数:
ClassLoader loader, 真实主题类的类加载器Class<?>[] interfaces, 真实主题类的类所实现的接口InvocationHandler, 代理对象要调用的方法
其中InvocationHandler接口的实现子类表示了代理对象的业务逻辑,他需要重写的invoke方法也有三个参数:
proxy代理对象,就是最终返回的那个代理对象。method反射出来的方法对象args调用方法的参数
public class ProxyFactory {
private Asus asus = new Asus();
public ComputerOrz getProxyObj() {
ComputerOrz proxyObj = (ComputerOrz) Proxy.newProxyInstance(
asus.getClass().getClassLoader(),
asus.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(asus, args);
System.out.println("电脑城加价2000卖给消费者(动态代理)");
return null;
}
});
return proxyObj;
}
}

动态代理和静态代理的区别
- Java的动态代理都是对接口进行代理的,也就是说如果你没有定义抽象主题类的话就没法使用动态代理。动态代理把接口中所有的方法都集中到了
invoke()中,这样在接口中方法很多的时候也可以灵活的处理。而静态代理就需要一个方法一个方法的进行中转。 - 当接口中增加了一个方法以后,静态代理所有的实现类和代理类都要实现这个方法。而动态代理压根没有代理类,我们只需要修改
invoke()里面的一部分代码即可。 - 静态代理的代理类在程序的编译期间就生成了,动态代理的代理类在程序运行的时候才会动态的生成。
优缺点
优点:
- 代理模式在客户端和目标对象之间起到一个中介和保护的作用
- 代理对象可以扩展目标对象的功能
- 代理模式可以将目标对象和客户端分离,一定程度上降低了耦合度
缺点:
- 系统复杂度提升了
使用场景
- 远程代理
本地连接远程服务器的时候,要实现网络的通信。但是会将网络通信部分2隐藏起来,只给本地服务一个接口,不必过多关心通信部分的细节。 - 防火墙代理
当浏览器使用代理时,防火墙就会将浏览器的请求转给互联网。互联网响应时,代理服务器在把相应装给浏览器 - 保护代理
控制对象的访问,可以根据需要给不用用户提供不同级别的使用权限。
源代码
边栏推荐
- Paopao Mart: empty souls need stories
- 如何更改Apple Watch上的表盘
- 函数的导数与微分的关系
- Exness sorted out three problems to be solved in Musk's acquisition of Twitter
- 一些技术想法:
- 什么?HomeKit、米家、Aqara等生态也能通过智汀与天猫精灵生态联动?
- Makefile does not compile some files
- Some technical ideas:
- 到底使用Thread还是Service?
- Error in created hook: “TypeError: Cannot read property ‘tableId‘ of undefined“
猜你喜欢

2022 operation of simulated examination platform for examination question bank of welder (elementary) special operation certificate

在循环中动态改变标签元素的样式

Dynamically changing the style of label elements in a loop

数商云:数字化供应链系统搭建,赋能企业实现物流供应链的优化升级

UE4_UE5制作3DUI-跟随相机朝向(附工程)

一款支持HomeKit的摄像头?智汀 IPC摄像头IC1开箱体验

函数的导数与微分的关系

实现领域驱动设计 - 使用ABP框架 - 解决方案概览

Iplook 5gc successfully connected with CICA international CHF (billing function)

wpa_supplicant的状态机迁移
随机推荐
Modèle de langage de pré - formation, Bert, roformer Sim aussi connu sous le nom de simbertv2
同花顺容易开户么?手机开户安全么?
RobotFramework 安装教程
Centeros install mangodb
How to manage tasks in note taking software such as flowus and notation?
IPLOOK和思博伦通信建立长期合作
IPLOOK作为O-RAN联盟会员,将共同促进5G产业发展
Implementing Domain Driven Design - using ABP framework - solution overview
在循环中动态改变标签元素的样式
org. apache. ibatis. binding. BindingException: Invalid bound statement (not found)
维智科技亮相西部数博会,时空AI技术获高度认可
Cluster, distributed and microservice concepts and differences
Method of activity jump to fragment (intent)
vs code突然无法进行代码跳转
Service实战:使用Service完成一个下载任务
Paopao Mart: empty souls need stories
PostgreSQL reconfigure from library
China's two meteorological "new stars" data products are shared with global users
Linked list 4- 21 merge two ordered linked lists
Robotframework installation tutorial