目录

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

作用

代理模式主要用于,通过代理类,来控制实际对象的访问权限

案例

cpp 复制代码
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;}
};
cpp 复制代码
void test()
{
    unique_ptr<VideoSite> p1(new FixBugVideoSite());
    //没有代理类的情况下,所有客户都可以观看所有电影
    p1->freeVideo();
    p1->vipVideo();
    p1->trickVideo();
}

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

  • 普通用户:只能免费观看电影
  • vip用户:可以观看vip电影和免费电影
  • 购票用户:可以观看免费电影、vip电影和购票电影

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

我们直接看代码

cpp 复制代码
//免费用户代理类
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();
}
cpp 复制代码
void test()
{
    unique_ptr<VideoSite>p1(new FreeVideoProxy());
    watchVideo(p1);
}

上述代理类的设计控制了非vip用户和非购票用户观看电影的权限 ,在测试代码里,我们只需使用代理类即可完成对该用户观看电影的权限问题,而不必在原业务的代码上进行修改,大大降低了代码出错的风险。

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

vip用户代理类

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

购票用户代理类

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

测试代码

cpp 复制代码
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;
}

在测试代码里可以看到,基于这种设计下,FixBugVideoSite类可不必关心业务权限的问题,只需开发不同种类的电影观看业务即可,而电影的观看权限则控制则由代理类完成,使用不同的代理类即可控制不同用户不同电影的观看权限

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
同勉共进3 小时前
虚函数表里有什么?(二)——普通单继承下的虚函数表
c++·单继承·虚函数表·dynamic_cast·rtii
永恒迷星.by5 小时前
文件操作(c语言)
c语言·c++·算法·文件操作
Zhichao_977 小时前
【UE5 C++课程系列笔记】32——读Json文件并解析
c++·ue5
点云SLAM7 小时前
C++20新增内容
c++·算法·c++20·c++ 标准库
照书抄代码8 小时前
C++11可变参数模板单例模式
开发语言·c++·单例模式·c++11
No0d1es8 小时前
CCF GESP C++编程 四级认证真题 2025年3月
开发语言·c++·青少年编程·gesp·ccf·四级·202503
No0d1es8 小时前
CCF GESP C++编程 五级认证真题 2025年3月
开发语言·c++·青少年编程·gesp·ccf·五级·2025年3月
shuaixio8 小时前
【C++代码整洁之道】第九章 设计模式和习惯用法
c++·设计模式·设计原则·常见设计模式·习惯用法
南宫生9 小时前
Java迭代器【设计模式之迭代器模式】
java·学习·设计模式·kotlin·迭代器模式
程序员小赵同学9 小时前
AI Agent设计模式二:Parallelization
开发语言·python·设计模式