- 含义
- 模型图
- 示例代码
- 结构
- Demo
- Subject
- RealSubject
- Proxy
- main
- 输出
- 参考
- 为其他对象提供一种代理以控制对这个对象的访问
房客租房都需要通过中介,无法直接和房东进行沟通。
PS: 可恶的二房东某种程度上也算是中介,但是又不完全是中介。
模型图模型图截图
#include结构 Demo Subjectclass Subject { public: virtual void Request() const = 0; }; class RealSubject : public Subject { public: void Request() const override { std::cout << "RealSubject: Handling request.n"; } }; class Proxy : public Subject { private: RealSubject *real_subject_; bool CheckAccess() const { // Some real checks should go here. std::cout << "Proxy: Checking access prior to firing a real request.n"; return true; } void LogAccess() const { std::cout << "Proxy: Logging the time of request.n"; } public: Proxy(RealSubject *real_subject) : real_subject_(new RealSubject(*real_subject)) { } ~Proxy() { delete real_subject_; } / * * 代理模式最常见的应用是延迟加载、缓存、控制访问、日志记录等。 * 代理可以执行这些操作之一,然后根据结果将执行传递给链接的 RealSubject 对象中的相同方法 . */ void Request() const override { if (this->CheckAccess()) { this->real_subject_->Request(); this->LogAccess(); } } }; void ClientCode(const Subject &subject) { // ... subject.Request(); // ... } int main() { std::cout << "Client: Executing the client code with a real subject:n"; RealSubject *real_subject = new RealSubject; ClientCode(*real_subject); std::cout << "n"; std::cout << "Client: Executing the same client code with a proxy:n"; Proxy *proxy = new Proxy(real_subject); ClientCode(*proxy); delete real_subject; delete proxy; return 0; }
- subject.h
#ifndef SUBJECT_H
#define SUBJECT_H
class Subject
{
public:
Subject();
virtual ~Subject();
virtual void request() const = 0;
};
#endif // SUBJECT_H
- subject.cpp
#include "subject.h"
Subject::Subject()
{
}
Subject::~Subject()
{
}
RealSubject
- RealSubject.h
#ifndef REALSUBJECT_H #define REALSUBJECT_H #include "subject.h" #includeclass RealSubject : public Subject { public: RealSubject(); void request() const override { qDebug()<<"RealSubject: Handler requestn"; } }; #endif // REALSUBJECT_H
- RealSubject.cpp
#include "realsubject.h"
RealSubject::RealSubject()
{
}
void RealSubject::request() const
{
qDebug()<<"RealSubject: Handler requestn";
}
Proxy
- Proxy.h
#ifndef PROXY_H
#define PROXY_H
#include "subject.h"
#include "realsubject.h"
class Proxy : public Subject
{
public:
Proxy();
Proxy(RealSubject *realSub);
~Proxy();
virtual void request() const override;
bool CheckAccess() const;
void LogAccess() const;
private:
RealSubject *m_realSubject;
};
#endif // PROXY_H
- Proxy.cpp
#include "proxy.h"
Proxy::Proxy()
{
}
Proxy::Proxy(RealSubject *realSub)
{
m_realSubject = realSub;
}
Proxy::~Proxy()
{
}
void Proxy::request() const
{
if(CheckAccess())
{
this->m_realSubject->request();
this->LogAccess();
}
}
bool Proxy::CheckAccess() const
{
qDebug()<<"Proxy: Checking access prior to firing a real request.n";
return true;
}
void Proxy::LogAccess() const
{
qDebug()<<"Proxy: Record logn";
}
main
#include输出#include "subject.h" #include "proxy.h" #include "realsubject.h" static void Client(Subject *subject) { subject->request(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); RealSubject *realSubject = new RealSubject(); Client(realSubject); Proxy *proxy = new Proxy(realSubject); Client(proxy); return a.exec(); }
RealSubject: Handler request Proxy: Checking access prior to firing a real request. RealSubject: Handler request Proxy: Record log参考
1.在C++中使用代理模式
2.代理模式详解



