代理模式是一种常见的设计模式,它允许你在不直接访问对象的情况下,通过一个代理对象来控制对该对象的访问。这个代理对象可以作为客户端和实际对象之间的中介,从而实现一些特定的控制功能,比如限制访问、记录访问日志等。
怎么理解呢,我们一般来说存在一个实际的对象,这个对象包含了丰富的业务方法,我们当然可以暴露出来给所有人使用。但是有时候我们并不希望这些方法没没有限制的使用,比如某个方法是重启服务器。如果这个方法不加约束的暴露给所有人,那将会是一场灾难。因此这个时候我们需要给这个对象一层保护壳,也就是代理,其它人都需要经过代理来访问它。再举一个例子。好比一个君主,如果随便让别人访问它,万一里面藏着刺客,这个君主随时面临生命危险。所以大家想要给君主传达信息,一般都是通过代理人(大臣)来帮忙传达,这就是代理模式的其中一种应用场景,安全代理。
- #pragma once
- #include
- #include
-
- using namespace std;
-
- //抽象类
- class VideoSite
- {
- public:
- virtual void freeMovie() = 0; //免费电影
- virtual void vipMovie() = 0; //vip电影
- virtual void ticketMovie() = 0;//用券电影
- };
-
- //具体实现类
- class FixBugVideoSite : public VideoSite
- {
- public:
- virtual void freeMovie() //免费电影
- {
- cout << "观看免费电影" << endl;
- }
- virtual void vipMovie() //vip电影
- {
- cout << "观看vip电影" << endl;
- }
- virtual void ticketMovie() //用券电影
- {
- cout << "用券观看电影" << endl;
- }
- };
-
- //普通用户代理类
- class FreeVideSiteProxy : public VideoSite
- {
- public:
- FreeVideSiteProxy()
- {
- pVideo = new FixBugVideoSite();
- }
- ~FreeVideSiteProxy()
- {
- delete pVideo;
- }
- virtual void freeMovie() //免费电影
- {
- pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法
- }
- virtual void vipMovie() //vip电影
- {
- cout << "不好意思,您不是VIP,请先充值。" << endl;
- }
- virtual void ticketMovie()//用券电影
- {
- cout << "不好意思,您没有券,请先购买。" << endl;
- }
- private:
- FixBugVideoSite* pVideo;
- };
-
- //VIP用户代理类
- class vipVideSiteProxy : public VideoSite
- {
- public:
- vipVideSiteProxy()
- {
- pVideo = new FixBugVideoSite();
- }
- ~vipVideSiteProxy()
- {
- delete pVideo;
- }
- virtual void freeMovie() //免费电影
- {
- pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法
- }
- virtual void vipMovie() //vip电影
- {
- pVideo->vipMovie();
- }
- virtual void ticketMovie()//用券电影
- {
- cout << "不好意思,您没有券,请先购买。" << endl;
- }
- private:
- VideoSite* pVideo;
- };
-
-
- void main()
- {
- unique_ptr
p1(new FreeVideSiteProxy()) ; - unique_ptr
p2(new vipVideSiteProxy()) ; -
- p1->freeMovie();
- p1->vipMovie();
- p1->ticketMovie();
-
- cout << "--------------------------" << endl;
- p2->freeMovie();
- p2->vipMovie();
- p2->ticketMovie();
- }
在上面的例子种,代理就是的作用就是做权限的隔绝。
优点:
缺点:
深入剖析C++代理模式:优缺点和应用场景一览无余 - 知乎 (zhihu.com)
C++之代理模式_c++代理模式_Flying clouds的博客-CSDN博客