C++代理模式
主要根据代理模式整理,感谢作者分享!
[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++代理模式的更多相关文章
- 【原】谈谈对Objective-C中代理模式的误解
		
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
 - 23种设计模式--代理模式-Proxy
		
一.代理模式的介绍 代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...
 - Spring代理模式及AOP基本术语
		
一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...
 - Java设计模式之代理模式(Proxy)
		
前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...
 - 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)
		
我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...
 - 设计模式(十三)代理模式(Proxy Pattern)
		
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
 - php实现设计模式之代理模式
		
<?php /* * 代理模式 * 为其他对象提供一种代理以控制对这个对象的访问. * 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...
 - PHP 代理模式
		
代理模式:为其他对象提供一种代理以控制对这个对象的访问. [代理模式中主要角色] 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实 ...
 - java代理模式之静态代理
		
作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于 ...
 - 设计模式-代理模式(Proxy Model)
		
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...
 
随机推荐
- InkCanvas控件的使用
			
原文:InkCanvas控件的使用 ==>InkCanvas设置位置跟Canvas一样.通过InkCanvas.Top之类的设置,需要设置的属性有EditingMode,来自于InkCanvas ...
 - EZ 2017 12 17初二初三第一次膜你赛
			
以后平时练习还是写一写吧. (题目搞来搞去太烦了,直接PDF存起来) T1 水题(???),主要是数据水,正解是设一个阙值,然而根本没人打.(暴力出奇迹) CODE #include<cstdi ...
 - [2016北京集训试题15]cot-[分块]
			
Description Solution 如图,假如我们知道了以任何一个点为顶点的135-180度的前缀和和90-180度的前缀和,我们就可以搞出三角形的面积. 差分.add[i][j]和dev[i] ...
 - FormData 数据转化为 json 数据
			
两种方法 <!-- 实例:将 FormData 转化为 json --> <meta charset="utf-8"/> <form enctype= ...
 - 11.10 (上午)开课二个月零六天(ajax基础,ajax做登录)
			
test.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
 - 带阴影的圆形 QLabel
			
带阴影的圆形 Label 来自: 公孙二狗
 - 洛咕 P3700 [CQOI2017]小Q的表格
			
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
 - [CF1083D]The Fair Nut’s getting crazy[单调栈+线段树]
			
题意 给定一个长度为 \(n\) 的序列 \(\{a_i\}\).你需要从该序列中选出两个非空的子段,这两个子段满足 两个子段非包含关系. 两个子段存在交. 位于两个子段交中的元素在每个子段中只能出现 ...
 - Js_获取当前日期时间
			
一.获取当前时间 new Date()方法---------得到结果是当前电脑时间如2011-11-6,10:07 二.获取有个固定的时间方法---------var endtime=new Date ...
 - Docker操作命令
			
docker --直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. docker [command] --help --深入的了解指定的 Docker 命令使用方法 dock ...