功能
为其他对象提供一种代理以控制对这个对象的访问
解决
- 主要解决:在直接访问对象时带来的问题
- 何时使用:想在访问一个类时做一些控制
- 如何解决:增加中间层
- 关键代码:实现与被代理类组合
优缺点
- 优点:
- 职责清晰
- 高扩展性
- 智能化
- 缺点:
- 请求的处理速度变慢
- 需要额外的工作量
应用场景
- 应用实例:
- Windows 里面的快捷方式。
- 猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
- 买火车票不一定在火车站买,也可以去代售点。
- 一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
- spring aop
- 使用场景:
- 远程代理
- 虚拟代理
- Copy-on-Write代理
- 保护代理
- Cache代理
- 防火墙代理
- 同步化代理
- 注意事项:
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口
- 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制
简单示例代码部分
Proxy.hpp
#ifndef _PROXY_H_
#define _PROXY_H_
#include <iostream>
using namespace std;
class Subject
{
public:
virtual ~Subject(){}
virtual void Request() = 0;
protected:
Subject(){}
};
class ConcreteSubject:public Subject {
public:
ConcreteSubject(){}
~ConcreteSubject(){}
void Request(){
cout<<"ConcreteSubject......request...."<< endl;
}
};
class Proxy {
public: Proxy(){}
Proxy(Subject* sub){
_sub=sub;
}
~Proxy(){
delete _sub;
}
void Request(){
cout<<"Proxy request...."<<endl;
_sub->Request();
}
private:
Subject* _sub;
};
#endif
main.cpp
#include "Proxy.h"
#include <iostream>
using namespace std;
int main() {
Subject* sub = new ConcreteSubject();
Proxy* p = new Proxy(sub);
p->Request();
return 0;
}