代理模式
定义:
给莫个对象提供抽象占位符,由代理对象控制对源对象的访问
优点:
(1)协调调用者和被调用者降低系统耦合
(2)可以在代理类增加额外的职责
(3)起到远程代理、缓存代理、虚拟代理、保护代理等功能
缺点:
(1)增加中间代理类,增加代码复杂性和系统性能消耗
(2)代理模式需新增额外工作
使用范围:
当客户端无法直接访问真实系统,或者访问需要增加其它前置方法
如:银行前置机提供口令验证等
结构:
proxy_pattern:代理类和真实系统抽象类
proxy:代理类实现与客户端交互
real_system:提供真实请求方法
实现:
namespace structural_pattern
{
class proxy_pattern
{
public:
virtual void request() = 0;
};
class real_system : public proxy_pattern
{
public:
virtual void request() override
{
std::cout << "真实系统请求应答" << std::endl;
}
};
class proxy : public proxy_pattern
{
public:
virtual void request() override
{
real_system real;
do_anything();
real.request();
}
private:
void do_anything()
{
std::cout << "代理者前置行为" << std::endl;
}
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
using namespace structural_pattern;
TEST(test_proxy_pattern_request, success_proxy_request)
{
proxy pro;
pro.request();
}
总结
(1)代理类与具体实现类继承统一接口,定义同一方法
(2)代理类与具体类是1对1关系,如果是1对多关系代理类需要额外区别,且要保证继承实现同一个抽象方法
(3)代理类可以增加前值或者后置方法
(4)与装饰模式的区别在于装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问