代理模式结构图:
代理模式到底好处在哪里呢??
为其他对象提供一种代理以控制对某 个对象的访问。抽象角色(Subject):声明真实对象和代理对象的共同接口。
代理角色(Proxy):代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象 可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色(ConcreteSubject):代理角色所代表的真实对象,是我们最终要引用的对象。
代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为,即代理类。满足对扩展开放,对修改封闭的原则。例如:接口A有一个接口方法operator(),真实角色:RealA实现接口A,则必须实现接口方法operator()。客户端Client调用接口A的接方法operator()。现在新需求来了,需要修改RealA中的operator()的操作行为。怎么办呢?如果修改RealA就会影响原有系统的稳定性,还要重新测试。这是就需要代理类实现附加行为操作。创建代理ProxyA实现接口A,并将真实对象RealA注入进来。ProxyA实现接口方法operator(),另外还可以增加附加行为,然后调用真实对象的operator()。从而达到了“对修改关闭,对扩展开放”,保证了系统的稳定性。我们看客户端Client调用仍是接口A的接口方法operator(),只不过实例变为了ProxyA类了而已。也就是说代理模式实现了ocp原则。
// 定义了Proxy和ConcreteSubject的公有接口,
// 这样就可以在任何需要使用到ConcreteSubject的地方都使用Proxy.
#include "iostream"
using namespace std;
class Subject
{
public:
virtual ~Subject(){};
virtual void Request()=0;
protected:
Subject();
};
class ConcreteSubject : public Subject
{
public:
ConcreteSubject(){};
~ConcreteSubject(){};
virtual void Request();
};
//定义代理类
class Proxy : public Subject
{
public:
Proxy();
~Proxy();
void DoSomething1();
virtual void Request();
void DoSomething2();
private:
Subject* _subject;
};
void ConcreteSubject::Request()
{
cout << "ConcreteSubject::Request" << endl;
}
Proxy::Proxy() : _subject(NULL)
{}
Proxy::~Proxy()
{}
void Proxy::DoSomething1()
{
cout << "Proxy::DoSomething1" << endl;
}
void Proxy::DoSomething2()
{
cout << "Proxy::DoSomething2" << endl;
}
void Proxy::Request()
{
if(NULL == this->_subject)
{
this->_subject = new ConcreteSubject();
}
this->DoSomething1();//表示额外附加的操作
this->_subject->Request();//代理的实体类操作
this->DoSomething2();//表示额外附加的操作
}
int main()
{
Proxy* proxy = new Proxy();
proxy->Request();
return 0;
}
所以说,使用代理的目的
之一
其实是附加操作。