天天看點

設計模式(七)代理模式C++

代理模式,定義:代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的通路。

通俗的來講代理模式就是我們生活中常見的中間人。

比如說,小李想追求一個小姐姐嬌嬌,但是小李不知道怎麼做,他委托戴勵去追,這樣的一個過程就是代理模式

下面是結構圖

設計模式(七)代理模式C++
#include<iostream>
#include <windows.h>
#include <string>
using namespace std;

// 被追求者類
class ShcoolGirl
{
public:
  std::string GetName()
  {
    return m_strName;
  }

  void SetName(const char*pszName)
  {
    m_strName = pszName;
  }
private:
  std::string m_strName;
};
// 代理接口
class IGiveGift
{
  virtual void GiveDolls() = 0; // 玩具
  virtual void GiveFlowers() = 0; // 花
  virtual void GiveChocolate() = 0; // 巧克力
};

//追求者類
class Pursuit :IGiveGift
{
public:
  Pursuit(ShcoolGirl shMm):m_shMm(shMm)
  {
  }
public:
  void GiveDolls()
  {
    std::string strGiveGift(m_strName);
    strGiveGift.append(":送洋娃娃給");
    strGiveGift.append(m_shMm.GetName());
    std::cout << strGiveGift .c_str()<< std::endl;

  }
  void GiveFlowers()
  {
    std::string strGiveGift(m_strName);
    strGiveGift.append(":送花給");
    strGiveGift.append(m_shMm.GetName());
    std::cout << strGiveGift.c_str() << std::endl;
  }
  void GiveChocolate()
  {
    std::string strGiveGift(m_strName);
    strGiveGift.append(":送巧克力給");
    strGiveGift.append(m_shMm.GetName());
    std::cout << strGiveGift.c_str() << std::endl;
  }
public:
  void SetMyName(const char* pszName)
  {
    m_strName = pszName;
  }
private:
  std::string m_strName;
  ShcoolGirl m_shMm;
};

// 代理類如下
class Proxy :IGiveGift
{
public:
  Proxy(Pursuit *pPursuit)
  {
    m_PursuitGg = pPursuit; 
  }

  void GiveDolls()
  {
    m_PursuitGg->GiveDolls();
  }

  void GiveFlowers()
  {
    m_PursuitGg->GiveFlowers();
  }
  void GiveChocolate()
  {
    m_PursuitGg->GiveChocolate();
  }
private:
  Pursuit* m_PursuitGg; // 追求者
};

int main()
{
  ShcoolGirl shGirl;
  shGirl.SetName("嬌嬌");

  Pursuit *pPursuit = new Pursuit(shGirl);
  pPursuit->SetMyName("小李");

  Proxy proDaili(pPursuit);
  proDaili.GiveDolls();
  proDaili.GiveChocolate();
  proDaili.GiveFlowers();
  system("pause");
  return 0;
}