C++设计模式笔记——代理模式

代理模式定义

代理模式定义:为其他对象提供一种代理,用以控制这个对象。

实际派生类继承基类,代理类也继承基类,代理类里包含一个基类对象,用来构建一个实际派生类对象,避开在构造函数里调用复杂的业务,将实际派生类成员的构造和调用封装在,代理类的调用接口里。

有些图形对象的创建开销很大。但是打开文档必须很迅速,因此在打开文档时,应避免一次性创建开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理,以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。

虚代理示例

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;  
}  

和策略模式里,业务类里包含一个基类成员,由调用处传一个相应的策略类对象进来,业务类里根据各自的策略类的实现去执行相应的操作。

优点

职责清晰。实际具体角色,只负责实现实际的业务逻辑,不用关心非本职责的事务,通过后期的代理完成具体的任务。这样代码会简洁清晰。

代理对象可以在客户端和目标对象之间起到中介的作用,这样就保护了目标对象。

扩展性好。

缺点

代码结构复杂

猜你喜欢

转载自blog.csdn.net/panjunnn/article/details/112057325