栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 之 代理模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 之 代理模式

文章目录
  • 含义
  • 模型图
  • 示例代码
  • 结构
  • Demo
    • Subject
    • RealSubject
    • Proxy
    • main
    • 输出
  • 参考

含义
  • 为其他对象提供一种代理以控制对这个对象的访问
    房客租房都需要通过中介,无法直接和房东进行沟通。

PS: 可恶的二房东某种程度上也算是中介,但是又不完全是中介。

模型图

模型图截图

示例代码
#include 

class 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;
}
结构

Demo Subject
  • 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"
#include 
class 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.代理模式详解

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692285.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号