代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢。cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。现在贴代码,以方便随用随取。

2.1.解释

main(),西门庆

IKindWomen,接口

CWangPo,代理

CPanJinLian,实际执行者之一

CJiaShi,实际执行者之二

说明:代理和实际执行者派生于共同的接口,代理拥有实际执行者的实例。代理的每一个函数(接口的实现函数),直接调用实际执行者的对应接口函数。

注意:代理只是简单的装载,然后调用实际执行者的函数。

看代码:

//IKindWomen.h

#pragma once
class IKindWomen
{
public:
    IKindWomen(void);
    virtual ~IKindWomen(void);
    virtual void MakeEyesWithMan() = 0;
    virtual void HappyWithMan() = 0;
};

//WangPo.h

#pragma once
#include "ikindwomen.h"
class CWangPo :
    public IKindWomen
{
public:
    CWangPo(IKindWomen *pKindWomen);
    ~CWangPo(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
private:
    IKindWomen *m_pKindWomen;
};

//WangPo.cpp

#include "StdAfx.h"
#include "WangPo.h"
CWangPo::CWangPo(IKindWomen *pKindWomen)
{
    this->m_pKindWomen = pKindWomen;
}
CWangPo::~CWangPo(void)
{
    delete this->m_pKindWomen;
}
void CWangPo::HappyWithMan()
{
    this->m_pKindWomen->HappyWithMan();
}
void CWangPo::MakeEyesWithMan(void)
{
    this->m_pKindWomen->MakeEyesWithMan();
}

//PanJinLian.h

#pragma once
#include "ikindwomen.h"
class CPanJinLian :
    public IKindWomen
{
public:
    CPanJinLian(void);
    ~CPanJinLian(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
};

//PanJinLian.cpp

#include "StdAfx.h"
#include "PanJinLian.h"
#include <iostream>
using std::cout;
using std::endl;
CPanJinLian::CPanJinLian(void)
{
}
CPanJinLian::~CPanJinLian(void)
{
}
void CPanJinLian::HappyWithMan(void)
{
    cout << " 潘金莲和男人做那个... ... " << endl;
}
void CPanJinLian::MakeEyesWithMan(void)
{
    cout << " 潘金莲抛媚眼 " << endl;
}

//JiaShi.h

#pragma once
#include "ikindwomen.h"
class CJiaShi :
    public IKindWomen
{
public:
    CJiaShi(void);
    ~CJiaShi(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
};

//JiaShi.cpp

#include "StdAfx.h"
#include "JiaShi.h"
#include <iostream>
using std::cout;
using std::endl;
CJiaShi::CJiaShi(void)
{
}
CJiaShi::~CJiaShi(void)
{
}
void CJiaShi::HappyWithMan(void)
{
    cout << " 贾氏和男人做那个... ... " << endl;
}
void CJiaShi::MakeEyesWithMan(void)
{
    cout << " 贾氏抛媚眼 " << endl;
}

//Proxy.cpp
#include "stdafx.h"
#include "WangPo.h"
#include "PanJinLian.h"
#include "JiaShi.h"
#include <iostream>
using std::cout;
using std::endl;
void DoPanJinLian()
{
    CWangPo *pWangPo;
    // 西门庆想找潘金莲,让王婆来安排。
    pWangPo = new CWangPo(new CPanJinLian());
    pWangPo->MakeEyesWithMan();
    pWangPo->HappyWithMan();
    delete pWangPo;
}
void DoJiaShi()
{
    CWangPo *pWangPo;
    // 西门庆想找贾氏,让王婆来安排。
    pWangPo = new CWangPo(new CJiaShi());
    pWangPo->MakeEyesWithMan();
    pWangPo->HappyWithMan();
    delete pWangPo;
}
int _tmain(int argc, _TCHAR* argv[])
{
    // 西门庆想找潘金莲
    DoPanJinLian();

// 西门庆想找贾氏
    DoJiaShi();

_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
    _CrtDumpMemoryLeaks();

system("pause");
    return 0;
}

看起来代理模式的结构和策略模式类似,都是由一个类来装载接口的一个实例,策略模式是CContext来装载,代理模式是CWangPo来装载。CContext不是从IStrategy派生,所以不需要实现IStrategy接口函数,而CWangPo是从IKindWomen派生的所以CWangPo很清楚CPanJinLian和CJiaShi的接口函数。这就是代理,代理人知道被代理人能干的事情即函数,所以代理人可以成为中介。

代理模式可以很好的将前后端分开,实现了松散耦合。代理模式属于结构型模式。上图仍然是例子中用到的类相关图,并不是代理模式的抽象类图。这样的类图更容易理解代理模式。抽象类图当然具有更高的抽象层次,但不利于理解。

设计模式C++学习笔记之二(Proxy代理模式)的更多相关文章

  1. cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现

    一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create ...

  2. 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载

      Prototype(原型模式) 20.1.解释 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. main(),客户 ICloneableNow,只有一个接口Clone CM ...

  3. Java设计模式学习笔记,二:工厂模式

    工厂模式,主要实现了创建者和调用者的分离. 分类:1.简单工厂模式:2.工厂方法模式:3.抽象工厂模式. 核心:实例化对象时,用工厂方法代替new操作. 一.简单工厂模式 也叫静态工厂模式,工厂类中实 ...

  4. python爬虫学习笔记(2)-----代理模式

    一.UserAgent UserAgent 中文意思是用户代理,简称UA,它是一个特殊字符串头,使得服务器能够识别用户 设置UA的两种方式: 1.heads from urllib import re ...

  5. 设计模式C++学习笔记之一(Strategy策略模式)

    无意中,从网上下到一本电子书<24种设计模式介绍与6大设计原则>,很好奇这里有24种设计模式,印象中GOF写的<设计模式>(Design Patterns),好像只有23种吧. ...

  6. 设计模式C++学习笔记之六(Facade门面模式)

      Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义 ...

  7. Spark学习笔记(二)—— Local模式

    Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍第一种模式. 1.Lo ...

  8. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  9. mybatis 学习笔记(二):mybatis SQL注入问题

    mybatis 学习笔记(二):mybatis SQL注入问题 SQL 注入攻击 首先了解下概念,什么叫SQL 注入: SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞. ...

随机推荐

  1. jdk和jvm基本介绍

    一.JDK和JRE? 在刚入门java开发的时候,第一步都要从官网下载JDK来帮助开发,下载下来安装之后看到安装目录结构如下 bin目录:存放Java的编译器.解释器等工具(可执行文件). db目录: ...

  2. 设计模式---状态变化模式之state状态模式(State)

    前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:Stat ...

  3. SQL Server 备份到网络盘网络映射盘

    declare @DBName nvarchar(max) declare @BakName nvarchar(max) --在这里修改数据库名称 select @DBName='[LFBMP.PO] ...

  4. Ubuntu 开启SSH服务以及有关设置:安装,指定端口号、免密登录、远程拷贝

    本文所用系统为 Ubuntu 18.04   什么是SSH?     简单说,SSH是一种网络协议,用于计算机之间的加密登录.全名为:安全外壳协议.为Secure Shell的缩写.SSH为建立在应用 ...

  5. nginx配置fcgi

    1.刚开始用网上最多的方式,perl脚本实现cgi,配置最后都完成,一直是504错误,看日志是perl脚本连接超时,可能是版本太旧了吧,nginx更新用不了那种方式了,搞不清楚.貌似那种帖子都是13年 ...

  6. centos下问题:connect:network is unreachable

    问题描述 弄了三台机器准备搭建一个集群,按照centos7系统,一台主节点安装桌面环境,两台计算节点.配置计算节点的时候,发现ping不通,出现connect:network is unreachab ...

  7. 理解BFC

    BFC:块格式化上下文(Block Formatting Context) 是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域. BFC 是一 ...

  8. range和xrange的区别

    range和xrange的区别 python3里面只有range,返回结果是一个生成器,官方文档是这样描述的 class range(object): """ range ...

  9. 第21月第9日 windows下使用vim+ctags+taglist

    1. windows下使用vim+ctags+taglist 最近在公司的同事指导下,学会使用这个东西编写代码,效率提高了不少.所以记录下来,方便大家使用. 1. 下载gvim74.exe文件,并安装 ...

  10. border-radius图解

    自己看了理解的border-radius: 设置参数: 100*100的正方形,第一个:border-top-left-radius:100px 100px,即圆的半径为100px.圆弧与上和左bor ...