【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2076|回复: 1

[设计模式] 设计模式C++学习笔记之二(Proxy代理模式)

[复制链接]
发表于 2013-8-8 10:37:30 | 显示全部楼层 |阅读模式
原作者:wang_gary

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

2.1.解释

main(),西门庆

IKindWomen,接口

CWangPo,代理

CPanJinLian,实际执行者之一

CJiaShi,实际执行者之二

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

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

看代码:[mw_shl_code=cpp,true]//IKindWomen.h


#pragma once
class IKindWomen
{
public:
    IKindWomen(void);
    virtual ~IKindWomen(void);
    virtual void MakeEyesWithMan() = 0;
    virtual void HappyWithMan() = 0;
};[/mw_shl_code][mw_shl_code=cpp,true]//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;
};
[/mw_shl_code][mw_shl_code=cpp,true]//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();
}[/mw_shl_code][mw_shl_code=cpp,true]//PanJinLian.h

#pragma once
#include "ikindwomen.h"
class CPanJinLian :
    public IKindWomen
{
public:
    CPanJinLian(void);
    ~CPanJinLian(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
};[/mw_shl_code][mw_shl_code=cpp,true]//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;
}[/mw_shl_code][mw_shl_code=cpp,true]//JiaShi.h

#pragma once
#include "ikindwomen.h"
class CJiaShi :
    public IKindWomen
{
public:
    CJiaShi(void);
    ~CJiaShi(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
};[/mw_shl_code][mw_shl_code=cpp,true]//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;
}[/mw_shl_code][mw_shl_code=cpp,true]//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;
}[/mw_shl_code]

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

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



发表于 2014-1-9 13:46:12 | 显示全部楼层
沙发下,可以发言了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 03:58

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表