[C/C++] -- 代理模式

代理模式是一种结构型设计模式,允许一个对象(代理)控制另一个对象的访问。代理对象通常充当客户端和实际目标对象之间的中间人,从而控制对目标对象的访问,可以在访问前后进行一些额外的处理。

代理模式的优点包括:

  • 控制对目标对象的访问:代理对象可以控制客户端对目标对象的访问,可以在访问前后进行一些额外的处理,如权限验证、缓存等。
  • 增强目标对象的功能:代理对象可以在不修改目标对象的情况下,通过代理对象来增强目标对象的功能,例如添加日志记录、性能监控等。
  • 解耦:代理模式可以将客户端与目标对象解耦,客户端无需知道目标对象的具体实现,只需要与代理对象进行交互。

代理模式的缺点包括:

  • 增加了系统复杂度:引入了代理对象会增加系统的复杂度,增加了额外的代码量。
  • 性能开销:在某些情况下,代理模式可能会引入额外的性能开销,特别是动态代理。
cpp 复制代码
#include <iostream>
#include <memory>
using namespace std;

/*
代理Proxy模式:  通过代理类,来控制实际对象的访问权限
客户 助理Proxy 老板 委托类
*/
class VideoSite                     //1、抽象类
{
public:
    virtual void freeMovie() = 0;   //免费电影
    virtual void vipMovie() = 0;    //VIP电影
    virtual void ticketMovie() = 0; //用券观看电影    
};
class FixBugVideoSite:public VideoSite//2、委托类
{
public:
    virtual void freeMovie()        //免费电影
    {
        cout << "观看免费电影" << endl;
    }
    virtual void vipMovie()         //VIP电影
    {
        cout << "观看VIP电影" << endl;
    }
    virtual void ticketMovie()      //用券观看电影
    {
        cout << "用券观看电影" << endl;
    }
};
//3.代理类
class FreeVideoSiteProxy:public VideoSite
{
public:
    FreeVideoSiteProxy()
    {
        pVideo = new FixBugVideoSite();
    }
    ~FreeVideoSiteProxy()
    {
        delete pVideo;
    }
    virtual void freeMovie()        //免费电影
    {
        pVideo->freeMovie();        //通过代理对象的freeMovie,访问真正委托类对象的freeMovie
    }
    virtual void vipMovie()         //VIP电影
    {
        cout << "只是普通游客,需要升级成VIP,才能观看VIP电影" << endl;
    }
    virtual void ticketMovie()      //用券观看电影
    {
        cout << "充值购买券,才能观看VIP电影" << endl;
    }
private:
    VideoSite *pVideo;
};
//3.代理类
class VipVideoSiteProxy:public VideoSite
{
public:
    VipVideoSiteProxy()
    {
        pVideo = new FixBugVideoSite();
    }
    ~VipVideoSiteProxy()
    {
        delete pVideo;
    }
    virtual void freeMovie()        //免费电影
    {
        pVideo->freeMovie();        //通过代理对象的freeMovie,访问真正委托类对象的freeMovie
    }
    virtual void vipMovie()         //VIP电影
    {
        pVideo->vipMovie();
    }
    virtual void ticketMovie()      //用券观看电影
    {
        cout << "充值购买券,才能观看VIP电影" << endl;
    }
private:
    VideoSite *pVideo;//4.用组合的方式使用代理对象
};

//这些都是通用的API接口,使用的都是基类的指针或引用
void watchMovie(unique_ptr<VideoSite> &ptr)
{
    ptr->freeMovie();
    ptr->vipMovie();
    ptr->ticketMovie();
}
int main()
{
    unique_ptr<VideoSite> p1(new FreeVideoSiteProxy());//5.客户直接访问代理对象
    unique_ptr<VideoSite> p2(new VipVideoSiteProxy());
    watchMovie(p1);
    watchMovie(p2);
    return 0;
}
相关推荐
啦啦啦啦啦zzzz1 小时前
算法:回溯算法
c++·算法·leetcode
会飞的小新1 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
Lzg_na1 小时前
订阅发布模块事例
c++
郝学胜-神的一滴1 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
汉克老师2 小时前
2026年CSP-J初赛分数线-----预测
c++·csp-j·小学生·学c++编程
脱胎换骨-军哥2 小时前
C++数据库存储引擎内核开发:B+树索引与MVCC并发控制的完整实现
数据库·c++·b树
小保CPP2 小时前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
爱刷碗的苏泓舒2 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言
无相求码2 小时前
指针的5层境界,从入门到劝退:C语言指针进阶全解析
c语言
乐观勇敢坚强的老彭3 小时前
信奥C++一维数组笔记
开发语言·c++·笔记