C++代理模式的实现
Posted Redamanc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++代理模式的实现相关的知识,希望对你有一定的参考价值。
模式思想
简介
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式 属于 结构型模式。
组成
- 抽象角色:通过接口或抽象类声明真实角色实现的业务方法;
- 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用;
- 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。(访问权限)
优点
- 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职的事务,通过后期的代理来完成事务,附带的结果就是编程简洁清晰;
- 代理对象可以在客户端和目标对象之间起到中介的作用,保护了目标对象;
- 高扩展性。
代码实现
情景
了解了代理模式的定义和优点以后,我们来模拟这样一个场景:
我们在网上观看电影的时候,一般都会借助一些视频网站(腾讯视频
、优酷
、爱奇艺
等);
在这些网站观看电影的时候,都会遇到这样的情况:
一些电影可以观看,一些电影(评分高的
、刚上映的
等)就观看不了,提示要充值VIP才能观看;
更有甚者,充了VIP也看不了,还需要买券观看。
满满的都是套路,唉 😦。
抛开其他不谈,这个观看视频的权限是如何实现的呢?其实就和我们今天要讲的代理模式息息相关。
代码
我们来模拟上述观看视频的情景:
// 抽象类
class VideoSite
{
public:
virtual void freemovie() = 0;
virtual void vipmovie() = 0;
virtual void ticketmovie() = 0;
};
// 委托类
class YangVideoSite :public VideoSite
{
public:
void freemovie()
{
cout << "观看免费电影" << endl;
}
void vipmovie()
{
cout << "观看vip电影" << endl;
}
void ticketmovie()
{
cout << "用券观看电影" << endl;
}
};
// 免费游客对应代理类
class FreeVideoSiteProxy :public VideoSite
{
public:
void freemovie()
{
video.freemovie();
}
void vipmovie()
{
cout << "您只是普通游客,需要升级成VIP,才能观看VIP电影" << endl;
}
void ticketmovie()
{
cout << "您目前没有电影券,需要购买券才能观看电影" << endl;
}
private:
YangVideoSite video;
};
// VIP会员对应代理类
class VipVideoSiteProxy :public VideoSite
{
public:
VipVideoSiteProxy() { pvideo = new YangVideoSite(); }
~VipVideoSiteProxy() { delete pvideo; }
void freemovie()
{
pvideo->freemovie();
}
void vipmovie()
{
pvideo->vipmovie();
}
void ticketmovie()
{
cout << "您目前没有电影券,需要购买券才能观看电影" << endl;
}
private:
YangVideoSite* pvideo;
};
解读
可以看到,我们代码里面的委托类YangVideoSite
就是上面提到的真实角色。它拥有了该网站所有视频的观看权限。
每一个代理类都有一个委托类
的数据成员。代理类通过委托类
来访问视频网站。并且,可以根据当前代理的用户的身份(普通游客
、VIP会员
),来限制其访问的内容。
为了模拟在视频网站上浏览视频的全部情景,我们可以设计一个函数,专门用来观看电影(免费电影
、VIP电影
、用券观看的电影
):
void watchMovie(unique_ptr<VideoSite>& ptr)
{
ptr->freemovie();
ptr->vipmovie();
ptr->ticketmovie();
}
结果
运行下面的代码:
int main()
{
unique_ptr<VideoSite> p1(new FreeVideoSiteProxy());
unique_ptr<VideoSite> p2(new VipVideoSiteProxy());
watchMovie(p1);
cout << "-----------------------------------------" << endl;
watchMovie(p2);
return 0;
}
运行结果如下:
参考资料
【1】代理模式(百度百科)
以上是关于C++代理模式的实现的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情