代理模式是一种结构型设计模式,旨在为其他对象提供一种代理或替代方法,以控制对这些对象的访问。在代理模式中,代理对象充当了客户端和目标对象之间的中间人,客户端通过代理访问目标对象,而不直接访问目标对象。
代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问。代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。代理模式: 通过代理类,来控制实际对象的访问权限客户 助理Proxy 老板(实际对象)委托类*/
#include <iostream>
#include <memory>
class VideoSite{ // 抽象类public:virtual void freeMovie()=0; // 免费电影virtual void vipMovie()=0; // vip电影virtual void ticketMovie()=0; // 用卷看};class FixBugVideoSite :public VideoSite{ // 委托类
public:virtual void freeMovie(){std::cout << "观看免费电影"<< std:: endl;}virtual void vipMovie(){std::cout << "观看vip电影"<< std:: endl;}virtual void ticketMovie(){std::cout << "用卷免费电影"<< std:: endl;}
};// 代理类 代理FixBugVideoSite
class FreeVideoSiteProxy:public VideoSite{
public:FreeVideoSiteProxy(){pVideo =new FixBugVideoSite();}~FreeVideoSiteProxy(){delete pVideo ;}virtual void freeMovie(){pVideo->freeMovie(); // 通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法}virtual void vipMovie(){std::cout << "您目前师普通用户,看不了观看vip电影"<< std:: endl;}virtual void ticketMovie(){std::cout << "您目前师普通用户,用卷看免费电影"<< std:: endl;}
private:VideoSite *pVideo;
};class VipVideoSiteProxy:public VideoSite{
public:VipVideoSiteProxy(){pVideo =new FixBugVideoSite();}~VipVideoSiteProxy(){delete pVideo ;}virtual void freeMovie(){pVideo->freeMovie(); // 通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法}virtual void vipMovie(){pVideo->vipMovie();}virtual void ticketMovie(){std::cout << "您目前没有卷"<< std:: endl;}
private:VideoSite *pVideo;
};// 这些都是通用的API接口,使用的都是基类的指针
void watchMovie(std::unique_ptr<VideoSite> &ptr){ptr->freeMovie();ptr->vipMovie();ptr->ticketMovie();
}int main(){// 这样需要在这里判断,是否够够看vip电影比较麻烦,需要是由委托类来搞std::unique_ptr<VideoSite> p1 (new FreeVideoSiteProxy());std::unique_ptr<VideoSite> p2 (new VipVideoSiteProxy());watchMovie(p1);watchMovie(p2);return 0;
}