结构型模式
这一类设计模式不关注对象的产生,关注的是类和对象的组合后功能的使用,是否符合场景的需求。
代理模式(Proxy Pattern)
代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。
模型化思想:
客户 ——
助理(Proxy)——
老板
代理模式体现的就是:
对老板访问权限的一些控制,并不是所有的客户都可以访问老板,地位身份不够的客户就会被助理阻挡从而访问不到老板。
代理模式实际上就是通过代理类
,控制实际对象(委托类
)的访问权限。
为了真实的了解代理模式的风格特点,我们使用下面这样一个情境:
我们在网上观看电影的时候,一般都会借助一些视频网站;在这些网站观看电影的时候,都会遇到这样的情况:一些电影可以观看,一些电影(评分高的、刚上映的等)就观看不了,提示要充值VIP才能观看;更有甚者,充了VIP也看不了,还需要买券观看。
抛开其他不谈,这个观看视频的权限是如何实现的呢?其实就和我们今天要讲的代理模式息息相关。
// 抽象类
class VideoSite
{
public:
virtual void freemovie() = 0;
virtual void vipmovie() = 0;
virtual void ticketmovie() = 0;
};
// 委托类
class K_VideoSite :public VideoSite
{
public:
void freemovie()
{
cout << "观看免费电影" << endl;
}
void vipmovie()
{
cout << "观看vip电影" << endl;
}
void ticketmovie()
{
cout << "用券观看电影" << endl;
}
};
// 免费游客对应代理类
class FreeVideoSiteProxy :public VideoSite
{
public:
FreeVideoSiteProxy() { pvideo = new K_VideoSite(); }
~FreeVideoSiteProxy() { delete pvideo; }
void freemovie()
{
pvideo->freemovie();//通过代理对象的freemovie来访问真正委托类对象的freemovie
}
void vipmovie()
{
cout << "您只是普通游客,需要升级成VIP,才能观看VIP电影" << endl;
}
void ticketmovie()
{
cout << "您目前没有电影券,需要购买券才能观看电影" << endl;
}
private:
VideoSite* pvideo;
};
// VIP会员对应代理类
class VipVideoSiteProxy :public VideoSite
{
public:
VipVideoSiteProxy() { pvideo = new K_VideoSite(); }
~VipVideoSiteProxy() { delete pvideo; }
void freemovie()
{
pvideo->freemovie();
}
void vipmovie()
{
pvideo->vipmovie();
}
void ticketmovie()
{
cout << "您目前没有电影券,需要购买券才能观看电影" << endl;
}
private:
VideoSite* pvideo;
};
为了模拟在视频网站上浏览视频的全部情景,我们可以设计一个函数,专门用来观看电影(免费电影、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;
}
可以看到,代码中的 委托类K_VideoSite
就是上面提到的真实角色。它拥有了该网站所有视频的观看权限。
每一个代理类都有一个委托类的数据成员。代理类通过委托类来访问视频网站。即客户访问的都是代理对象,并且,可以根据当前代理的用户的身份(普通游客、VIP会员),来限制其访问的内容。
总结
代理模式有以下几个组成部分:
抽象类
:通过接口或抽象类声明真实角色实现的业务方法;委托类
:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用;代理类
:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。(访问权限)- 以组合的方式来使用代理对象
代理模式具有以下优点:
- 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职的事务,通过后期的代理来完成事务,附带的结果就是编程简洁清晰;
- 代理对象可以在客户端和目标对象之间起到中介的作用,保护了目标对象;
- 高扩展性。