C++设计模式 | Proxy代理模式

代理模式是一种设计模式,用于提供对真实对象的访问控制。它在真实对象和客户端之间创建代理,代理可以执行额外的操作,如权限检查、缓存等。在电影观看的例子中,代理类限制了不同用户等级的电影访问权限,如免费电影、VIP电影和付费电影的观看条件。这种模式在软件开发中广泛应用,特别是在权限管理和远程访问场景。
摘要由CSDN通过智能技术生成

概念

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

          代理模式是一种应用很广 泛的结构型设计模式,而且变化形式非常多,常见的代理形式包括远程代理、保护代理、虚拟代理、缓冲代理。
 

代理模式结构图


Subject类,定义了RealSubject和Proxy的共用接口这样就在任何使用realSubject的地方都可以使用Proxy

RealSubject类,定义Proxy所代表的真实实体

Proxy类,保存一个引用是的代理可以访问实体、并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体
 

代码实现

class Subject
{
public:
    virtual void Requst() = 0;
};

class ReadSubject : public Subject
{
public:
    void Requst()
    {
        cout << "真实请求" << endl;
    }
};
class Proxy
{
public:
    void Requst()
    {
        if (sub == nullptr)
        {
            sub = new ReadSubject();
        }
        cout << "代理对象代理了:";
        sub->Requst();
    }

private:
    ReadSubject *sub;
};

int main()
{
    Proxy p ;
    p.Requst();

    return 0;
}

具体例子的代码实现

平时我们在某些视频软件上看电影时,会有免费电影 VIP电影  付费电影 。这些电影会根据我们用户的身份去开放不同的权限。

//抽象类电影
class Movie
{
public:
    virtual void freeMovies() = 0;
    virtual void vipMovies() = 0;
    virtual void ticketMovies() = 0;
};
//真实类电影
class RealMovie
{
public:
    void freeMovies()
    {
        cout << "观看免费电影" << endl;
    }
    void vipMovies()
    {
        cout << "观看VIP电影" << endl;
    }
    void ticketMovies()
    {
        cout << "用券观看电影" << endl;
    }
};

//代理类 代理free电影
class freeMovieProxy : public Movie
{
public:
    
    void freeMovies()
    {
        movie.freeMovies();
    }
    void vipMovies()
    {
        cout << "您是普通用户,需要升级为VIP用户,即可观看VIP电影" << endl;
    }
    void ticketMovies()
    {
        cout << "您目前没有券,需要购买电影券,即可观看电影" << endl;
    }

private:
    RealMovie movie;
};
//代理类 代理vip电影
class VIPMovieProxy : public Movie
{
public:
    void freeMovies()
    {
        movie.freeMovies();
    }
    void vipMovies()
    {
        movie.vipMovies();
    }
    void ticketMovies()
    {
        cout << "您目前没有券,需要购买电影券,即可观看电影" << endl;
    }

private:
    RealMovie movie;
};

void witch(Movie *movie)
{
    movie->freeMovies();
    movie->vipMovies();
    movie->ticketMovies();
}
int main()
{
    Movie *m1 = new freeMovieProxy();
    Movie *m2 = new VIPMovieProxy();

    witch(m1);
    witch(m2);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值