代理模式定义
代理模式定义:为其他对象提供一种代理,用以控制这个对象。
实际派生类继承基类,代理类也继承基类,代理类里包含一个基类对象,用来构建一个实际派生类对象,避开在构造函数里调用复杂的业务,将实际派生类成员的构造和调用封装在,代理类的调用接口里。
有些图形对象的创建开销很大。但是打开文档必须很迅速,因此在打开文档时,应避免一次性创建开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理,以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。
虚代理示例
class Image
{
public:
Image(string name): m_imageName(name) {}
virtual ~Image() {}
virtual void Show() {}
protected:
string m_imageName;
};
class BigImage: public Image //原版
{
public:
BigImage(string name):Image(name) {} //耗时
~BigImage() {}
void Show() { cout<<"Show big image : "<<m_imageName<<endl; } //耗时操作
};
class ImageProxy: public Image
{
private:
Image *m_bigImage;
public:
ImageProxy(string name):Image(name),m_bigImage(0) {}
~ImageProxy() { delete m_bigImage; }
void Show()
{
if(m_bigImage == NULL)
m_bigImage = new BigImage(m_imageName);
m_bigImage->Show();
}
};
//客户调用:
int main()
{
Image *image = new ImageProxy("proxy.jpg"); //代理 ,将耗时的构造函数,延迟在调用时再加载。
image->Show(); //需要时由代理负责打开 ,内包含创建对象和实际业务函数
delete image;
return 0;
}
和策略模式里,业务类里包含一个基类成员,由调用处传一个相应的策略类对象进来,业务类里根据各自的策略类的实现去执行相应的操作。
优点
职责清晰。实际具体角色,只负责实现实际的业务逻辑,不用关心非本职责的事务,通过后期的代理完成具体的任务。这样代码会简洁清晰。
代理对象可以在客户端和目标对象之间起到中介的作用,这样就保护了目标对象。
扩展性好。
缺点
代码结构复杂