07 大话设计模式C++实现之代理模式

# 类图

07 大话设计模式C++实现之代理模式

/*
代理模式:
例子:追女生让别人帮忙送礼物,就是通过代理完成业务
代理实现接口,代理类关联于追求者类,也就是说代理的业务主要取决于请求者
代理与请求者实现相同的接口,因此利用纯虚函数实现接口类
*/
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>

using namespace std;

//定义要追的女生
class SchoolGirl
{
private:
    string name;
public:
    string getName()
    {
        return this->name;
    }
    void setName(string value)
    {
        this->name = value;
    }

};

//定义接口类IGiveGift
class IGiveGift
{
public:
    //C++实现接口的方法是利用纯虚函数
    virtual void GiveDolls() = 0;
    virtual void GiveFlowers() = 0;
    virtual void GiveChocolate() = 0;
};

//请求者(追求者)
class Pursuit : public IGiveGift
{
private:
    SchoolGirl mm;
public:
    Pursuit(SchoolGirl &mm)
    {
        this->mm = mm;
    }
    virtual void GiveDolls()
    {
        cout << mm.getName() << "送你一个娃娃!" << endl;
    }
    virtual void GiveFlowers()
    {
        cout << mm.getName() << "送你一束花! " << endl;
    }
    virtual void GiveChocolate()
    {
        cout << mm.getName() << "送你巧克力! " << endl;
    }
};

//代理
class Proxy : public IGiveGift
{
    //让代理也实现送礼物的接口
private:
    Pursuit *gg;
public:
    Proxy(SchoolGirl &mm)
    {
        gg = new Pursuit(mm);
    }
    //在实现的过程中去调用追求者的方法
    virtual void GiveDolls()
    {
        gg->GiveDolls();
    }
    virtual void GiveFlowers()
    {
        gg->GiveFlowers();
    }
    virtual void GiveChocolate()
    {
        gg->GiveChocolate();
    }
};

//客户端实现代码
void Client()
{
    SchoolGirl *tian = new SchoolGirl; //在堆上开辟对象
    tian->setName("美女");
    Proxy *good_man = new Proxy(*tian);
    good_man->GiveChocolate();
    good_man->GiveDolls();
    good_man->GiveFlowers();
    if (tian != NULL) {
        delete tian;
        tian = NULL;
    }
    if (good_man != NULL)
    {
        delete good_man;
        good_man = NULL;
    }
}

int main()
{
    Client();
    system("pause");
    return EXIT_SUCCESS;
}

/*
代理模式应用总结:
1. 远程代理:
就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
应用实例:WebService在.NET中的应用,在应用程序项目中加入一个Web引用,引用一个WebService,此时会在项目中生成WebReference的文件夹
和一些文件,其实他们就是代理,这就可以解决远程访问的问题。
2. 虚拟代理:
根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
例子:打开一个网页时,里面可能有很多文字和图片,但是可以很快打开这个网页,文字一下就能看到,而图片则是一张一张加载的。那些未打开
的图片框就是虚拟代理代替了真实的图片用于优化下载过程
3. 安全代理
用来控制真实对象的访问时的权限
一般用于对象应该有不同的访问权限的时候
4. 智能指引
是指当调用真实的对象时,代理会处理另外一些事情。
例子:计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放他;或当第一次引用一个持久对象时,将它装入内存;或在访问第一个
实际对象前,检查是否已经锁定他,以确保其他对象不能引用它。它们都是通过代理在访问一个对象时附加一些内务处理
*/