天天看点

设计模式(七)代理模式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;
}