设计模式——代理

1、引言

代理模式是非常常见的模式,在生活中的例子也非常多,例如想要租房,这时需要找一个房产中介帮你物色你想要的房子,这个中介就是代理对象。

2、定义

代理模式是一种结构型设计模式,它通过引入一个代理对象来控制对原始对象的访问。
代理模式在客户端和目标对象之间添加了一个代理,代理对象与目标对象实现相同的接口,客户端通过代理对象来间接地访问目标对象。

代理模式通常涉及以下几个角色:

  • 抽象主题(Subject):
    定义了真实主题和代理对象共同的接口,这样代理对象可以在任何需要真实主题的地方代替它。
  • 真实主题(Real Subject):
    定义了代理对象所代表的真实对象。
  • 代理(Proxy):
    维持一个对真实主题对象的引用,并提供与真实主题对象相同的接口,以便在需要时能够代理真实主题对象的操作,同时可以在调用真实主题对象之前或之后执行额外的逻辑。

代理模式可以用于以下情况:

  • 远程代理:
    当目标对象位于远程服务器上时,可以使用代理模式来封装网络通信细节,使得客户端能够通过代理对象访问远程对象,实现远程方法调用。
  • 虚拟代理:
    当创建一个资源消耗较大的对象时,可以使用代理模式延迟加载该对象,只有在真正需要时才创建。例如,在图像加载时可以使用代理对象显示一个占位符图像,直到实际需要显示图像时再加载真实的图像对象。
  • 安全代理:
    代理模式可以控制对目标对象的访问权限,实现权限控制或认证等安全性需求。代理对象可以根据权限要求判断是否允许客户端访问目标对象。
  • 日志记录和统计:
    代理模式可以用于记录方法调用日志、统计方法调用次数等功能,可以在代理对象中添加额外的功能,而无需修改目标对象的代码。
  • 缓存代理:
    代理模式可以使用缓存来提高系统的性能。代理对象可以在调用目标对象方法之前进行缓存数据的查询,如果缓存中存在相应的结果,则直接返回缓存数据,避免了重复计算或访问数据库的开销。

代理模式的核心思想是:将对目标对象的访问委托给代理对象,通过代理对象来间接访问目标对象,同时可以在代理对象中添加额外的逻辑处理。

3、优缺点

优点:

  1. 通过代理对象,可以隐藏真实对象的实现细节,提供简单的接口给客户端使用,从而降低了客户端与真实对象之间的耦合度。职责清晰
  2. 代理模式可以在不修改真实对象的情况下,对其进行增强或者控制访问。代理对象可以在调用真实对象之前或之后执行额外的操作,例如权限验证、缓存数据等。高扩展性
  3. 代理模式可以实现延迟加载,即在真正需要时才创建真实对象。这样可以提高系统的性能和资源利用率。智能化

缺点:

  1. 代理模式在一些特定情况下可能会降低系统的性能。比如,远程代理模式涉及网络通信,可能会引入延迟和开销;虚拟代理涉及对象的创建和初始化过程,可能会带来额外的开销。
  2. 在某些情况下,代理模式会增加系统的复杂性。引入代理对象需要额外的代码和类结构,可能会导致代码量的增加,增加系统的复杂性和维护成本。
  3. 如果代理对象过多或者嵌套过深,会导致调试和排错变得困难。因为在调试过程中,需要跟踪多个对象的交互过程,增加了调试的复杂性。

4、示例

我们在编程中经常会使用到的智能指针shared_ptr,就可以认为是一种代理模式,
首先,智能指针提供了与原始指针几乎一样的访问方式,保证了对象访问的透明性。
其次,类似std::shared_ptr,在创建时并不直接持有对象的所有权,而是通过引用计数的方式进行间接访问。这种延迟加载的特性使得智能指针可以在需要时才创建对象,类似于代理模式中的虚拟代理。
最后,智能指针通常还提供了额外的功能,比如引用计数、析构函数的执行、内存的自动释放等。这些额外的功能类似于代理模式中代理对象所提供的增强或拦截操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值