主要根据代理模式整理,感谢作者分享!

[DP]上的定义:为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用。本文主要介绍虚代理和智能引用两种情况。

考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。这是[DP]一书上的给的例子。下面给出代理模式的UML图。

 #include <bits/stdc++.h>
//#include "solution.h"
using namespace std; #define debug(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl class CImage
{
public:
virtual ~CImage(){cout << "~CImage()\n";}
virtual void Show(){}
protected:
CImage(string imgName): m_imgName(imgName){cout << "CImage()\n";}
string m_imgName;
}; //concrete implement
class CBigImage : public CImage
{
public:
CBigImage(string imgName): CImage(imgName), m_bigImgName(imgName){
cout << "CBigImage()\n";
}
~CBigImage(){
cout << "~CBigImage()\n";
}
void Show(){cout << "show big image" <<endl;}
protected:
string m_bigImgName;
}; // proxy
class CBigImageProxy : public CImage
{
public:
CBigImageProxy(string imgName): CImage(imgName), m_img(NULL), m_bigImgName(imgName){
cout << "CBigImageProxy()\n";
}
~CBigImageProxy(){
if(NULL != m_img){
delete m_img;
m_img = NULL;
}
cout << "~CBigImageProxy()\n";
}
void Show(){
if(NULL == m_img){
m_img = new CBigImage(m_bigImgName);
}
m_img->Show();
}
private:
CImage *m_img;
string m_bigImgName;
}; class Subject
{
public:
virtual ~Subject(){cout << "~Subject()\n";}
virtual void Request()=;
protected:
Subject(){cout << "Subject()\n";}
}; class ConcreteSubject : public Subject
{
public:
ConcreteSubject(){
cout << "ConcreteSubject()\n";
}
~ConcreteSubject(){
cout << "~ConcreteSubject()\n";
}
virtual void Request(){cout << "ConcreteSubject Request()\n";}
}; class Proxy : public Subject
{
public:
Proxy(){
cout << "Proxy()\n";
this->m_sub = new ConcreteSubject();
}
// Proxy(Subject* _sub):m_sub(_sub){
// cout << "Proxy(Subject)\n";
// } virtual void Request()//实现对委托者的委托任务执行与补偿
{
this->m_sub->Request();
}
~Proxy(){
if(NULL != this->m_sub){
delete this->m_sub;
this->m_sub = NULL;
}
cout << "~Proxy()" << endl;
} private:
Subject *m_sub;
}; int main(int argc, char *argv[])
{
CBigImageProxy *bip = new CBigImageProxy("proxy.jpg");
bip->Show();
delete bip;
bip = NULL; Proxy *py = new Proxy();
py->Request();
delete py;
py = NULL;
return ;
}
// g++ -g -Wall main.cpp -o xmain

两个代理模式的示例

至于智能指针,建议可以参考C++11标准的智能指针。

C++代理模式的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. 23种设计模式--代理模式-Proxy

    一.代理模式的介绍       代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...

  3. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...

  4. Java设计模式之代理模式(Proxy)

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

  5. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

  6. 设计模式(十三)代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  7. php实现设计模式之代理模式

    <?php /* * 代理模式 * 为其他对象提供一种代理以控制对这个对象的访问. * 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  8. PHP 代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问. [代理模式中主要角色] 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实 ...

  9. java代理模式之静态代理

    作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于 ...

  10. 设计模式-代理模式(Proxy Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...

随机推荐

  1. Express app.listen 函数了解

    最近一直在学习如何用原生的 Node.js 来做一个网站.在写的同时也在学习 Express 源码. 一直觉得 Express 开启服务器的方法挺有趣的,就看了一下. 在 Express 运行的时候会 ...

  2. Hadoop日记Day11---主从节点接口分析

    一.NameNode 的接口分析 1. NameNode本质 经过前面的学习,可以知道NameNode 本身就是一个java 进程.观察RPC.getServer()方法的第一个参数,发现是this, ...

  3. 【HNOI2018】游戏

    题面 题解 这道题目到底有没有靠谱一点的解法啊... 有很多种\(\color{green}{\mathrm{AC}}\)的方法,设\(L[i],R[i]\)表示点\(i\)最左边和最右边能够到达的位 ...

  4. SSIS 更新变量

    在Package中声明一个variable,在package运行的过程中,SSIS如何update Variable? 第一种方法:使用 Script Task 来更新Variable的值 1,创建一 ...

  5. asp.net web api参数

    翻译自:http://www.c-sharpcorner.com/article/parameter-binding-in-asp-net-web-api/ 主要自己学习下,说是翻译,主要是把文章的意 ...

  6. 大厂面试官:Java工程师的“十项全能”

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...

  7. webpack简单原理及用法

    前言 如果你已经对Webpack精通了或者至少一直在工作中使用它,请关闭当前浏览器标签,无视这篇文章. 这篇文章本意是写给我自己看的,作为一篇Cookbook供快速查询和上手用.原因是虽然工作中会涉及 ...

  8. 2017中国人工智能公司榜单发布,颠覆AT的AI独角兽全在这

    每年12月,创业邦研究中心评选并报道“中国创新成长企业100强”,这个榜单我们已经连续做了8年,是中国最有潜力的创业新贵榜,受到了业内广泛认可.从2015年开始我们发现,人工智能上榜企业明显增多,20 ...

  9. Final互评------《弹球学成语》---- 杨老师粉丝群

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题;  N(Need,需求):本产品面相青少年及小学生,基于这些用户数量再加上一些休闲玩家,需求量还是比较大的.   A ...

  10. Github与SmartGit使用说明与建议

    当使用github做协同的时候,我们常常需要在客户端安装相应的软件,SmartGit就是一款非常出色的软件,不过是要付费的,我们可以使用non-commercial版本. Download: http ...