设计模式【十二】:代理模式
伪代码
class Web{
public:
Web();
access();
}
class PornHub: public Web{
public:
PornHub();
access(){
cout<<"Welcome to Pornhub!"<<endl;
}
}
class PornhubProxy: public Web{
public:
Proxy(){
_web = new PornHub;
}
access(){
login();
_web.access();
charge();
}
private:
PornHub _web;
void login(){
cout<<"Welcome to VPN"<<endl;
}
void charge(){
cout<<"Proxy down, $100 is charged."<<endl;
}
}
优缺点
优点
- 访问对象时提供重定向。
- 处于某种考虑,不希望客户端直接访问对象时,可采用代理模式。
- 不改变被代理对象的代码。
何时使用
- 需要相对于简单指针来说更加强壮的对于对象的引用
实现时技巧
- 由于是对于对象的引用,在c++中可以通过代理模式重载->运算符。
- 代理可以知晓其代理对象的类别。不过这种情况可能不完全符合代理模式的目的,见辨析。
辨析:代理or装饰器?
我们注意到,如果将代理模式的被代理对象由客户端设置,那么代码的形式非常接近于装饰器模式。鄙人认为,代理模式与装饰器模式有如下区别:
- 最根本地,装饰器模式中客户端可以访问被装饰者,而代理模式下客户端无法直接访问被代理者。从这个角度来说,代理模式下代理与被代理者是一一对应的,且代理的初始化会一并初始化被代理对象,而不是先初始化代理,然后用一个set方法设置其被代理者——这意味着客户端可以直接访问被代理对象。采用装饰器模式,是因为客户端虽然可以访问目标对象,但是目标对象的功能有局限性,客户端希望功能扩展;采用代理模式,则是因为客户端压根无法访问目标对象。
- 一般从功能来说,代理模式对被代理对象的功能改动不大,而装饰器则进行较大的扩展。