- 分类:结构型模式
- 特点:为其他对象提供了一种代理,以控制对这个对象的访问。
- 模式结构:
- UML图:略(后补)
- Subject(抽象主题):声明了 RealSubject 与 Proxy 的共同接口,定义了某个/些功能。
- RealSubject(真实主题):通常执行具体的业务逻辑,Proxy 控制对它的访问。
- Proxy(代理):持有一个 RealSubject 引用(指针),可以在需要时将请求转发给 RealSubject,以此起到代理的作用。
- Client(客户端):通过 Proxy 间接地与 RealSubject 进行交互。
- 适用场景:
- 远程代理(Remote Proxy),虚拟代理,保护代理,缓冲代理,智能引用代理等。
- 实例分析
- 代码语法说明:override关键字:override保留字表示当前函数重写了基类的虚函数。作用1:在函数比较多的情况下可以提示读者某个函数重写了基类虚函数,作用2:强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。
- 案例背景:在现实生活中,代理无处不在 - 代购、手机代理商、火车票代售点。。。
这里,代理模式可以理解为:移动公司把充值的职责托付给代理点,代理点代替移动公司充值,客户直接与代理点打交道,而非移动公司。
- 1、创建抽象主题:为其提供一个接口 Recharge(),用于充值
#ifndef __SUBJECT_H__
#define __SUBJECT_H__
class ITeclo
{
public:
ITeclo() {}
virtual ~ITeclo() {}
virtual void Recharge(int money) = 0;
};
#endif
- 2、创建真实主题:继承自抽象主题类,提供了业务方法的具体实现
//real_subject.h
#ifndef __REAL_SUBJECT_H__
#define __REAL_SUBJECT_H__
#include "subject.h"
#include<iostream>
class CMCC : public ITeclo
{
public:
CMCC() {}
void Recharge(int money) override
{
std::cout<<"charge "<< money << std::endl;
}
};
#endif //REAL_SUBJECT_H
//proxy.h
#ifndef __PROXY_H__
#define __PROXY_H__
#include "subject.h"
#include "real_subject.h"
class Proxy : public ITeclo
{
public:
Proxy() { m_pCMCC = NULL; }
~Proxy() { delete m_pCMCC; }
void Recharge(int money) override
{
if (money >= 50)
{
if (m_pCMCC == NULL)
m_pCMCC = new CMCC();
m_pCMCC->Recharge(money);
}
else
std::cout << "money is little!" << std::endl;
}
private:
CMCC* m_pCMCC;
};
#endif //PROXY_H
//main.cpp
#include "proxy.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) {if(p != NULL) delete p; p = NULL;}
#endif
int main()
{
Proxy* pProxy = new Proxy();
pProxy->Recharge(30);
pProxy->Recharge(100);
system("pause");
return 0;
}
- 运行结果