Proxy模式
Intention:
为其他对象提供一种代理以控制对这个对象的访问。
When:
1、创建开销大的对象时,比如显示一幅大的图片,我们将这个创建过程交给Proxy去完成(Virtual Proxy)。
2、为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(特别是网络性能不好时),可将这个操纵的过程
交给一个Proxy完成(Remote Proxy).
3、对对象进行访问控制时,比如论坛中不同权限的用户有不同的操作权限,将这个工作交给一个Proxy完成(Protection Proxy).
4、智能指针.
C++ Code Example:
//proxy.h
#ifndef PROXY_H
#define PROXY_H
class Subject{
public:
virtual ~Subject();
virtual void Request() = 0;
protected:
Subject();
};
class ConcreteSubject : public Subject{
public:
ConcreteSubject();
~ConcreteSubject();
void Request();
};
class Proxy{
public:
Proxy();
Proxy(Subject* sub);
~Proxy();
void Request();
private:
Subject* m_sub;
};
#endif // PROXY_H
//proxy.cpp
#include "proxy.h"
#include <iostream>
using std::cout;
using std::endl;
Subject::Subject(){
}
Subject::~Subject(){
}
ConcreteSubject::ConcreteSubject(){
}
ConcreteSubject::~ConcreteSubject(){
}
void ConcreteSubject::Request(){
cout << "ConcreteSubject::Request" << endl;
}
Proxy::Proxy(){
}
Proxy::Proxy(Subject *sub){
m_sub = sub;
}
Proxy::~Proxy(){
delete m_sub;
}
void Proxy::Request(){
cout << "Proxy::Request" <<endl;
m_sub->Request();
}
//main.cpp
#include "proxy.h"
#include <iostream>
int main()
{
Subject* sub = new ConcreteSubject();
Proxy *p = new Proxy(sub);
p->Request();
return 0;
}
Discussion:
从代码中可以看到,Proxy的Request请求实际上是交给了sub来执行。
Proxy模式最大的好处是实现了逻辑和实现的彻底解耦。