前
设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
一、代理模式
代理模式是常见的设计模式之一,顾名思义,代理模式就是代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。(为真实对象提供代理,然后供其他对象通过代理访问真实对象)
二、代码实现
代码如下(示例):
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()
{
cout << "观看VIP电影" << endl;
}
virtual void ticketMovie()
{
cout << "用券观看电影" << endl;
}
};
//代理类 代理FixBugVideoSite
class FreeVideoSiteProxy :public VideoSite
{
public:
FreeVideoSiteProxy()
{
pVideo = new FixBugVideoSite();
}
~FreeVideoSiteProxy()
{
delete pVideo;
}
virtual void freeMovie() //通过代理类对象freeMovie,来访问真正委托类对象的freeMovie方法
{
pVideo->freeMovie();
}
virtual void vipMovie()
{
cout << "你目前只是普通游客,需要升级成VIP,才能观看VIP电影" << endl;
}
virtual void ticketMovie()
{
cout << "你目前没有券,需要购买电影券,才能观看电影" << endl;
}
private:
VideoSite* pVideo;
};
class VipVideoSiteProxy :public VideoSite
{
public:
VipVideoSiteProxy()
{
pVideo = new FixBugVideoSite();
}
~VipVideoSiteProxy()
{
delete pVideo;
}
virtual void freeMovie() //通过代理类对象freeMovie,来访问真正委托类对象的freeMovie方法
{
pVideo->freeMovie();
}
virtual void vipMovie()
{
pVideo->vipMovie();
}
virtual void ticketMovie()
{
cout << "你目前没有券,需要购买电影券,才能观看电影" << endl;
}
private:
VideoSite* pVideo;
};
//这些都是通用的API接口,使用的都是基类的指针或者引用
void watchMovice(unique_ptr<VideoSite>& ptr)
{
ptr->freeMovie();
ptr->vipMovie();
ptr->ticketMovie();
}
int main()
{
unique_ptr<VideoSite> p1(new FreeVideoSiteProxy());
unique_ptr<VideoSite> p2(new VipVideoSiteProxy());
//watchMovice(std::move(p1));
//watchMovice(std::move(p2));
watchMovice(p1);
watchMovice(p2);
return 0;
}
总结
这篇文章主要实现了代理模式