C++设计模式编程中proxy代理模式的使用实例

 更新时间:2016年03月09日 11:40:35   投稿:goldensun  
这篇文章主要介绍了C++设计模式编程中proxy代理模式的使用实例解析,代理模式可以被归类为结构型的设计模式,代理模式主张为对象提供一种代理以控制对这个对象的访问,需要的朋友可以参考下

代理模式典型的结构图为:

201639114315740.jpg (558×217)

实际上,代理模式的想法非常简单。

代理模式的实现:

完整代码示例(code):代理模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。

代码片断 1:Proxy.h

//Proxy.h
#ifndef _PROXY_H_
#define _PROXY_H_
class Subject{
  public:
  virtual ~Subject();
  virtual void Request() = 0;
  protected:
  Subject();
  private:
};
class ConcreteSubject:public Subject{
  public:
  ConcreteSubject();
  ~ConcreteSubject();
  void Request();
  protected:
  private:
};
class Proxy{
  public:
  Proxy();
  Proxy(Subject* sub);
  ~Proxy();
  void Request();
  protected:
  private:
  Subject* _sub;
};
#endif //~_PROXY_H_

代码片断 2:Proxy.cpp

//Proxy.cpp
#include "Proxy.h"
#include <iostream>
using namespace std;
Subject::Subject(){
}
Subject::~Subject(){
}
ConcreteSubject::ConcreteSubject(){
}
ConcreteSubject::~ConcreteSubject(){
}
void ConcreteSubject::Request(){
  cout<<"ConcreteSubject......request
  ...."<<endl;
}
Proxy::Proxy(){
}
Proxy::Proxy(Subject* sub){
  _sub = sub;
}
Proxy::~Proxy(){
  delete _sub;
}
void Proxy::Request(){
  cout<<"Proxy request...."<<endl;
  _sub->Request();
}

代码片断 3:main.cpp

//main.cpp
#include "Proxy.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[]){
   Subject* sub = new ConcreteSubject();
  Proxy* p = new Proxy(sub);
  p->Request();
  return 0;
}

代码说明:代理模式的实现很简单,这里不做多余解释。可以看到,示例代码运行后,p 的 Request 请求实际上是交给了 sub 来实际执行。

再来看一个例子:

#include <iostream> 
#include <string> 
using namespace std; 
 
class Receiver 
{ 
private: 
  string name; 
 
public: 
  Receiver(string name):name(name) 
  { 
 
  } 
  string GetName() 
  { 
    return name; 
  } 
}; 
 
class Subject 
{ 
public: 
  virtual void display(){} 
}; 
 
class Sender:public Subject 
{ 
  Receiver *someone; 
public: 
  void SetReceiver(Receiver *someone) 
  { 
    this->someone = someone; 
  } 
  virtual void display() 
  { 
    cout<<"i hate you:" << someone->GetName()<<endl; 
  } 
}; 
 
class Proxy:public Subject 
{ 
public: 
  Subject *realobject; 
 
  void SetClient(Subject *client) 
  { 
    this->realobject = client; 
  } 
 
  void display() 
  { 
    realobject->display(); 
  } 
}; 
 
int main() 
{ 
  Receiver *recv = new Receiver("nobody"); 
  Sender *obj  = new Sender; 
  obj->SetReceiver(recv); 
  Proxy *proxy = new Proxy; 
  proxy->SetClient(obj); 
 
  proxy->display(); 
 
  system("pause"); 
  return 0; 
} 

由此可见,代理模式最大的好处就是实现了逻辑和实现的彻底解耦。

相关文章

  • C++读写(CSV,Yaml,二进制)文件的方法详解

    C++读写(CSV,Yaml,二进制)文件的方法详解

    为了处理文件,我们可以利用fstream库。在这个库里面有三种数据类型:ofstream,ifstream,fstream。本文将利用这个库实现不同文件的读写操作,需要的可以参考一下
    2022-05-05
  • C++ Boost Intrusive库示例精讲

    C++ Boost Intrusive库示例精讲

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++实现LeetCode(21.混合插入有序链表)

    C++实现LeetCode(21.混合插入有序链表)

    这篇文章主要介绍了C++实现LeetCode(21.混合插入有序链表),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言位图算法详解

    C语言位图算法详解

    这篇文章主要介绍了C语言实现的位图算法,主要包括了位图算法的定义与应用,对于C程序算法设计的学习有一定的借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C++实现学生选课系统

    C++实现学生选课系统

    这篇文章主要为大家详细介绍了C++实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 显示内存状态示例分享

    显示内存状态示例分享

    这篇文章主要介绍了显示内存状态示例,代码简单,下面直接看代码,需要的朋友可以参考下
    2014-02-02
  • VS2019安装cbd调试器的实现步骤

    VS2019安装cbd调试器的实现步骤

    本文主要介绍了VS2019安装cbd调试器的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    这篇文章主要介绍了stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列),需要的朋友可以参考下
    2014-05-05
  • Qt学习笔记之QPalette调色板类

    Qt学习笔记之QPalette调色板类

    这篇文章主要为大家详细介绍了Qt学习笔记之QPalette调色板类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 详解C语言之文件操作下)

    详解C语言之文件操作下)

    这篇文章主要介绍了关于C语言文件操作方法的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-11-11

最新评论