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

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

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

代理模式的实现:

完整代码示例(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++
, 设计模式
代理模式
,以便于您获取更多的相关知识。

时间: 2024-10-25 20:51:28

C++设计模式编程中proxy代理模式的使用实例_C 语言的相关文章

实例讲解C++设计模式编程中State状态模式的运用场景_C 语言

State模式允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更(Requirement Changing),经常我们做好的一个设计.实现了一个系统原型,咱们的客户又会有了新的需求.我们又因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计.实现好的类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带来的后果就是设计根本就不可能封闭.编译永远都是整个系统代码. 访问者模式则提

C++设计模式编程中Facade外观模式的使用实例解析_C 语言

外观模式提供了一个统一的接口,用来访问子系统的一群接口.外观定义了一个高层接口,让子系统更容易使用.外观模式让接口变得简单,简化了子系统的接口.外观模式十分简单,简而言之,就是简化你的类的接口,将一系列的复杂的过程封装到内部,对外只提供最简单的接口.结构图: 适用场景:当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变得越来越复杂.大多数模式使用时都会产生更多更小的类.这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难.F

Ruby设计模式编程中对外观模式的应用实例分析_ruby专题

何为外观模式?     外观模式为子系统中一组不同的接口提供统一的接口.外观定义了上层接口,通过降低复杂度和隐藏子系统间的通信以及依存关系,让子系统更加易于使用.     比方说子系统中有一组不同的类,其中一些彼此依赖.这让客户端难以使用子系统中的类,因为客户端需要知道每一个类.外观起到整个子系统的入口.有些客户端只需要子系统的某些基本行为,而对子系统的类不做太多定制,外观为这样的客户端提供简化的接口.只有需要从某些子系统的类定制更多行为的客户端,才会关注外观背后的细节.     外观模式:为系

详解C++设计模式编程中对状态模式的运用_C 语言

状态模式:当一个对象的内在状态发生变化时,允许改变其行为,这个对象看来像是改变了其类. 状态模式与策略模式的UML图几乎一模一样,下面列举了两者的不同: (1)可以通过环境类状态的个数来决定是使用策略模式还是状态模式. (2)策略模式的环境类自己选择一个具体策略类,具体策略类无须关心环境类:而状态模式的环境类由于外在因素需要放进一个具体状态中,以便通过其方法实现状态的切换,因此环境类和状态类之间存在一种双向的关联关系. (3)使用策略模式时,客户端需要知道所选的具体策略是哪一个,而使用状态模式时

详解Java的设计模式编程中的原型模式_java

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.类型:创建类模式类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.Prototype类需要具备以下两个条件: 实现Cloneable接口.在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法.在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException

详解Java设计模式编程中的访问者模式_java

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.类型:行为类模式类图: 例子:例如,思考一下添加不同类型商品的购物车,当点击结算的时候,它计算出所有不同商品需付的费用.现在,计算逻辑即为计算这些不同类型商品的价格.或者说通过访问者模式我们把此逻辑转移到了另外一个类上面.让我们实现这个访问者模式的例子. 为了实现访问者模式,最先需要做的是创建能够被添加到购物车中代表不同类型商品(itemElement)的类. ItemElement.ja

详解Java设计模式编程中的策略模式_java

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换.类型:行为类模式类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过的行为类模式中,有一种模式也是关注对算法的封装--模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽

实例讲解Java的设计模式编程中责任链模式的运用_java

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.类型:行为类模式类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler3.r

实例解析Ruby设计模式编程中Strategy策略模式的使用_ruby专题

今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会.要帮什么忙呢?你很好奇. 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的数据,现在需要完成一个选择性查询用户信息的功能.他说会传递给你一个包含许多用户名的数组,你需要根据这些用户名把他们相应的数据都给查出来. 这个功能很简单的嘛,你爽快地答应了.由于你们项目使用的是MySQL数据库,你很快地写出了如下代码: require 'mysql' class QueryUtil def find_us