代理模式——C++实现
目录
1. 代理模式简介
2. 代码示例
1. 代理模式简介
代理模式是一种行为型模式。
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接访问引用目标对象,代理对象作为访问对象和目标对象之间的中介,代理模式也叫做委托模式。
代理模式实际上作为一个中间层,处于要操作的目标对象和客户代码之间的中间层。相当于一个中介。
代理模式涉及到的角色主要有三个:
- 抽象主题(抽象接口类):通过接口类声明真实主题的业务接口。
- 真实主题(业务实现类):实现了具体的业务,是代理对象所引用的真实对象。
- 代理类:提供了和真实主题相同的接口,并引用了一个真实主题对象,可以调用具体的业务接口,访问真实主题的功能。
UML类图如下所示:
以租房为例,房屋中介就相当于代理对象,房东就相当于真实主题。客户只需要和中介打交道即可。
代理对象并不真正实现服务,而是通过调用引用的真实对象的相应接口来提供服务,真正的业务还是由真实主题来完成。
代理对象的目的在于执行具体业务的前后加入一些其他的操作,比如权限控制、缓存、日志记录等功能。
这样真实的业务类就可以专注于业务的实现,其他的限制操作在代理类中实现。
代理模式的关键就在于代理类和真实主题类继承自相同的接口,并且代理模式引用一个真实的主题对象。
2. 代码示例
这里我们模拟一个计算器的程序,代理类将限制计算器的使用次数,超过使用次数上限将限制访问。
#if 1
#include <iostream>
using namespace std;
class Subject
{
public:
virtual int add(int a, int b) = 0;
virtual int sub(int a, int b) = 0;
};
class RealSubject : public Subject
{
public:
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
};
class Proxy : public Subject
{
private:
RealSubject* m_realSubject;
unsigned int m_count;
public:
Proxy(RealSubject* realSubject, unsigned int count = 3)
{
m_realSubject = realSubject;
m_count = count;
}
int add(int a, int b)
{
if (m_count == 0)
{
cout << "剩余访问次数为0,无法访问" << endl;
return 0;
}
else
{
m_count--;
cout << "剩余访问次数:" << m_count << endl;
return m_realSubject->add(a, b);
}
}
int sub(int a, int b)
{
if (m_count == 0)
{
cout << "剩余访问次数为0,无法访问" << endl;
return 0;
}
else
{
m_count--;
cout << "剩余访问次数:" << m_count << endl;
return m_realSubject->sub(a, b);
}
}
};
int main()
{
RealSubject realSubject;
Proxy proxy(&realSubject);
cout << proxy.add(10, 5) << endl;
cout << proxy.sub(10, 5) << endl;
cout << proxy.add(10, 5) << endl;
cout << proxy.sub(10, 5) << endl;
cout << proxy.add(10, 5) << endl;
return 0;
}
#endif
运行结果如下图所示: