当前位置:网站首页>代理模式(Proxy)
代理模式(Proxy)
2022-06-28 09:25:00 【初学小白Lu】

为其他对象提供一种代理以控制对这个对象的访问。这样实现了业务和核心功能分离。
主要解决在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
使用时机: 想在访问一个类时做一些控制。
解决: 增加中间层。
**关键代码:**实现与被代理类组合。
应用实例:
1、Windows 里面的快捷方式。
2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
3、买火车票不一定在火车站买,也可以去代售点。
4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
5、spring aop。
组成
- Subject(抽象主题角色):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
- Proxy(代理主题角色):代理主题角色通过关联关系引用真实主题角色,因此可以控制和操纵真实主题对象;代理主题角色中提供一个与真实主题角色相同的接口(以在需要时代替真实主题角色),同时还可以在调用对真实主题对象的操作之前或之后增加新的服务和功能;
- RealSubject(真实主题角色):定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
- 客户端(Client) 能通过同一接口与服务或代理进行交互,所以你可在一切需要服务对象的代码中使用代理。
优点
1、职责清晰。 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
2、高扩展性。
3、智能化。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
缺点:
1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
分类
- 虚拟代理(Virtual Proxy):是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,使其只有在真正需要时才被创建。
示例,虚拟代理的主要目的是实现延迟,一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。
// 抽象类
class Image
{
public :
Image(std::string name) : m_name(name){
}
virtual ~Image( ){
}
virtual void Show( ) = 0; // 显示文档的函数
protected :
std::string m_name; // 文档名
};
// 大型实体类
class BigImage : public Image
{
public :
BigImage(std::string name) : Image(name){
}
virtual ~BigImage( ){
}
void Show( )
{
std::cout <<"This is Big Image..." <<std::endl;
}
};
// 大型图片代理器
class BigImageProxy : public Image
{
public :
BigImageProxy(std::string name) :Image(name), m_bigImage(NULL){
}
virtual ~BigImageProxy( )
{
delete m_bigImage;
}
void Show( )
{
if(this->m_bigImage == NULL)
{
m_bigImage = new BigImage(this->m_name);
}
m_bigImage->Show( );
}
private :
BigImage *m_bigImage;
};
// 客户端代码
int main( )
{
Image *Image = new BigImageProxy("Image.txt");
Image->Show( );
delete Image;
return 0;
}
- 远程代理(Remote Proxy):为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以是在本机器上,也可以在另一台机器中。多见于通讯,如网络、IPC和RPC中,一般需要提供提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法(如JAVA中的stub和skeleton),然后实现之间的具体通讯,对于client 而言stub(其实是stub和skeleton共同工作)就是其远程代理。
- 智能引用代理(Smart Reference Proxy):是指当调用真实对象时,代理处理另外一些事,比如记录对此对象的调用次数等。
安全代理:也叫保护代理,用来控制真实对象访问时的权限,如果有必要的话,可以给不同调用者提供不同的权限。 - 写时拷贝代理:虚拟代理的一种,把复制推迟到只有客户的需要时才进行。
- 缓存代理(Cache Proxy):为某一个目标的操作结果提供临时存储空间,以便其他客户的可以共享访问,有点缓存的味道。
- 防火墙代理:保护对象,不让用户访问,安全代理的特例。
- 同步代理:可以让几个用户同时访问同一个对象而不产生冲突。
- 保护代理(Protection Proxy)
根据访问权限,可以使用保护代理来控制对资源的访问。例如,有一个员工对象,保护代理可以允许普通员工调用对象的某些方法,管理员调用其他方法。
注意事项:
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
边栏推荐
- Resource scheduling and task scheduling of spark
- When the interviewer asks you to write binarysort in two ways
- RESTful风格
- Apache Doris 成为 Apache 顶级项目
- 玩玩sftp上传文件
- The constructor is never executed immediately after new()!!!!!
- ==和eqauls()的区别
- 01 distributed system overview
- SQL injection file read / write
- 全局异常处理器与统一返回结果
猜你喜欢

English translation plug-in installation of idea

PMP Exam key summary VI - chart arrangement

spark的资源调度和任务调度

Apiccloud, together with 360 Tianyu, helps enterprises keep the "first pass" of APP security

Use of Jasper soft studio report tool and solution of thorny problems

Ingersoll Rand panel maintenance IR Ingersoll Rand microcomputer controller maintenance xe-145m

Interpretation of new products: realm launched GT neo2 Dragon Ball customized version

Calcul des frais d'achat et de vente d'actions

Full link service tracking implementation scheme

1182:合影效果
随机推荐
Scenario method and error recommendation method for learning basic content of software testing (2)
Test cases for learning the basic content of software testing (II)
HDI blind hole design, have you noticed this detail?
For the development of short video app, the elder warned me to choose the open source code
Data visualization makes correlation analysis easier to use
2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠
PMP Exam key summary IX - closing
SQL optimization experience: from 30248 seconds to 0.001 seconds
English translation plug-in installation of idea
Two interview demo
[ybtoj advanced training guide] maximum separation [hash] [Floyd]
PMP examination key summary VIII - monitoring process group (2)
Function sub file writing
Implementation of single sign on
PMP考试重点总结八——监控过程组(2)
Data modeling based on wide table
P2394 yyy loves Chemistry I
1. Kimball dimension modeling of data warehouse: what is a fact table?
Methods for creating multithreads ---1 creating subclasses of thread class and multithreading principle
How to reduce the risk of project communication?