代理模式:为其他对象提供一种代理以控制对这个对象的访问。
当今生活越来越方便,即使不出国门也能买到其他国家的商品,这多亏有海外代购。而代购就类似于我们这篇所要介绍的代理模式中的代理。
结合实际生活我们可以理解代理模式:由于我们平时可能工作繁忙,可能想要买些海外商品,但是并没有时间让我们出去购物,这时我们就可以通过代购帮我们购买想要的东西。也就是说代购替我们出国购买。
![](https://i-blog.csdnimg.cn/blog_migrate/6b19c9d11005f9ec7a7e61790bda1a97.png)
Subject类定义了RealSubject 和 Proxy的公共接口,这样就可以在任何使用RealSubject的地方使用Proxy。
这可以理解为,代理就是代替买家做相同的事情,所以提供公共接口,好让代理能做相同的事。
/* 购物 */
class Purchase{
public:
virtual void BuyShoes(){}
virtual void BuyCloth() {}
virtual void GarageKits(){}
};
买家也就是RealSubject类,定义Proxy所代表的实体。
/* 买家 */
class Buyer : public Purchase{
public:
void BuyShoes(){
cout << "买双鞋子 ^-^ " << endl;
}
void BuyCloth(){
cout << "买件衣服 ^-^ " << endl;
}
void GarageKits(){
cout << "买个手办 ^-^ " << endl;
}
};
代购就相当于Proxy类,保存一个RealSubject引用使得代理能够访问实体,理解为代理必须知道买家需求,根据用户需求调用具体方法。
/* 代购 */
class Proxy : public Purchase{
public:
Proxy(){
if (b == nullptr)
b = new Buyer();
}
void BuyShoes(){
b->BuyShoes();
}
void BuyCloth(){
b->BuyCloth();
}
void GarageKits(){
b->GarageKits();
}
private:
Buyer* b;
};
客端调用:
int main()
{
Proxy* pro = new Proxy();
pro->BuyShoes();
pro->BuyCloth();
pro->GarageKits();
return 0;
}
代理模式适用场合:
常见代理分:远程代理、虚拟代理、安全代理、智能指引。
- 远程代理:为一个对象在不同地址空间提供局部代表。可以隐藏一个对象存在于不同地址空间的事实。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。
- 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。比如:打开一个很大的HTML网页时,里面可能有很多文字、图片,但还是可以很快打开,此时所看到的是所有文字,但图片却是一张一张地下载后看到的。那些未打开的图片框,就是通过虚拟代理来代替真实图片,此时代理存储了真实图片的路径和尺寸。
- 安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。比如:在论坛中,不同 的身份登陆,拥有的权限是不同的,使用代理模式可以控制权限。
- 智能指引代理:指当调用真实对象时,代理处理另外一些事。比如:纪录访问 的流量,提供一些友情提示等等。
本篇参照《大话设计模式》、《深入浅出设计模式》、《设计模式:可复用面向对象软件的基础》相关章节内容。