设计模式--代理模式Proxy(结构型)

一、代理模式

为其他对象提供一种代理以控制对这个对象的访问。

二、UML图

三、例子

(1)虚代理

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

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 BigImageProxy: public Image
{
private:
    BigImage *m_bigImage;
public:
    BigImageProxy(string name):Image(name),m_bigImage(0) {}
    ~BigImageProxy() { delete m_bigImage; }
    void Show() 
    {
        if(m_bigImage == NULL)
            m_bigImage = new BigImage(m_imageName);
        m_bigImage->Show();
    }
};

int main()
{
    Image *image = new BigImageProxy("proxy.jpg"); //代理
    image->Show(); //需要时由代理负责打开
    delete image;
    return 0;
}

 三、代理模式的几种使用场景

(1)虚代理:Proxy根据需要来创建构造开销很大的对象,该对象只有在需要的时候才会被真正地创建

(2)远程代理:用来在不同的地址空间上代表同一个对象,在java里最典型的就是RMI技术

(3)copy-on-write:在客户端操作的时候,只有对象确实发生改变了,才会真的拷贝目标对象,也是一种虚代理技术

(4)保护代理:控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,控制他们对原始对象的访问

(5)智能指针

(6)编译防火墙:C++中利用指向实现的指针PIMPL(pointer to implementation),来实现“类的接口与实现”解耦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值