前言:
代理模式:为其他对象提供一种代理以控制对这个对象的访问,有时也可以在此之上进行某些操作或者拓展,这样就实现了业务和核心功能分离。
定义:
为其他对象提供一种代理以控制(隔离,使用接口)对这对象的访问。 ——《设计模式》GoF
代理模式的应用场景:
- 修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
- 就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
- 使用代理模式,可以将功能划分的更加清晰,有助于后期维护
优点:
- 职责清晰。
- 高扩展性。
- 智能化。
缺点:
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
使用场景:
1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
代码演示:
# include <iostream>
# include <cstdlib>
# include <string>
using namespace std;
class IFactory
{
public:
IFactory(){
}
virtual void func() = 0;
};
class My_Phone_Factory:public IFactory{
public:
My_Phone_Factory(){
}
void func(){
string str = "我的手机工厂正在生产...";
std::cout<<str<<std::endl;
}
};
class FoxconProxy:public IFactory{
public:
FoxconProxy(IFactory* factory){
m_real = factory;
}
void func(){
m_real->func();
}
private:
IFactory* m_real;
};
int main(void)
{
IFactory* proxy = new My_Phone_Factory();
FoxconProxy* Proxy = new FoxconProxy(proxy);
Proxy->func();
system("pause");return 0;
}
这里代理模式的代码,我们使用的目的其实很明确,访问代理类再访问真正要访问的对象。因为代理类可以在真正的类执行之前,进行预处理。
举个例子:
在用户登录时, 真正的登录类和代理登录类都实现了Login接口, 不同的是Proxy类的方法中增加了用户是否合法的判断, 只有合法时才去调用真正登录类的login方法. 用户访问的其实是Proxy的login方法。
代理模式主要分为四类:
远程代理,虚代理,保护代理和智能引用。 其它还有挺多不常用的代理模式
- 远程代理
- 负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;
- 调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。
- 虚代理
-
可以缓存实体的附加信息,以便延迟对它的访问;
-
直到我们真正需要一个对象的时候才创建它,比如当加载图片时,我们打开不同的相册,才会去显示所选相册的图片。
-
当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。
-
浏览器就使用了代理 参考文章!
-
-
保护代理
- 添加信息 检查调用者是否具有实现一个请求所必须的访问权限。
-
智能引用代理
- 当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。