設計模式C++學習筆記之二(Proxy代理模式)

來源:互聯網
上載者:User

標籤:簡單   app   leaks   ++   happy   代理模式   use   let   內容   

代理,一看名字就知道這隻是個中介而已,真實的執行者在代理的後面呢。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代理模式)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.