0
点赞
收藏
分享

微信扫一扫

c++设计模式之代理模式

搬砖的小木匠 2024-02-08 阅读 14

作用

案例

class VideoSite
{
public:
    virtual void freeVideo()=0;
    virtual void vipVideo()=0;
    virtual void trickVideo()=0;
};

class FixBugVideoSite:public VideoSite
{
public:
    void freeVideo(){cout<<"免费观看电影"<<endl;}
    void vipVideo(){cout<<"vip客户观看电影"<<endl;}
    void trickVideo(){cout<<"购买电影票观看电影"<<endl;}
};
void test()
{
    unique_ptr<VideoSite> p1(new FixBugVideoSite());
    //没有代理类的情况下,所有客户都可以观看所有电影
    p1->freeVideo();
    p1->vipVideo();
    p1->trickVideo();
}

我们在这段代码里定义了三个功能,来模拟不同的客户观看电影的权限

显然对于不同种类的电影,有不同的观看权限。因此,我们要想办法给不同种类的电影赋予不同的权限,这就是代理模式的作用

我们直接看代码

//免费用户代理类
class FreeVideoProxy:public VideoSite
{
public:
    FreeVideoProxy():_videoPtr(new FixBugVideoSite()){}
    void freeVideo()
    {
        _videoPtr->freeVideo();
    }
    void vipVideo()
    {
        cout<<"您不是vip用户!"<<endl;
    }
    void trickVideo()
    {
        cout<<"请购买电影票观看!"<<endl;
    }
private:
    VideoSite* _videoPtr;
};

void watchVideo(unique_ptr<VideoSite>& videoPtr)
{
    videoPtr->freeVideo();
    videoPtr->vipVideo();
    videoPtr->trickVideo();
}
void test()
{
    unique_ptr<VideoSite>p1(new FreeVideoProxy());
    watchVideo(p1);
}

同理,我们也可以给另外两种用户添加代理类以控制其观看电影的权限,如下:

vip用户代理类

class VipVideoProxy:public VideoSite
{
public:
    VipVideoProxy():_videoPtr(new FixBugVideoSite()){}
        void freeVideo()
    {
        _videoPtr->freeVideo();
    }
    void vipVideo()
    {   
        _videoPtr->vipVideo();
    }
    void trickVideo()
    {
        cout<<"请购买电影票观看!"<<endl;
    }
private:
    VideoSite* _videoPtr;
};

购票用户代理类

class TrickVideoProxy:public VideoSite
{
public:
    TrickVideoProxy():_videoPtr(new FixBugVideoSite()){}
    void freeVideo()
    {
        _videoPtr->freeVideo();
    }
    void vipVideo()
    {   
        _videoPtr->vipVideo();
    }
    void trickVideo()
    {
        _videoPtr->trickVideo();
    }
private:
    VideoSite* _videoPtr;
};

测试代码

void test()
{
    unique_ptr<VideoSite>p1(new FreeVideoProxy());
    unique_ptr<VideoSite>p2(new VipVideoProxy());
    unique_ptr<VideoSite>p3(new TrickVideoProxy());
    cout<<"普通用户:"<<endl;
    watchVideo(p1);
    cout<<"----------------------"<<endl;
    cout<<"vip用户:"<<endl;
    watchVideo(p2);
    cout<<"----------------------"<<endl;
    cout<<"购票用户:"<<endl;
    watchVideo(p3);
    cout<<"----------------------"<<endl;
}

举报

相关推荐

0 条评论