设计模式之代理模式

来源:互联网 发布:程序员交流 编辑:程序博客网 时间:2024/06/09 16:58

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍代理模式的实现。

[DP]上的定义:为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用。本文主要介绍虚代理和智能引用两种情况。

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

下面给出代理模式的UML图。

简单实现如下:

#include <iostream>#include <string>class image {public:    image(const std::string& name)         : name_(name) {}    virtual ~image() {}    virtual void show() {}protected:    std::string name_;};class big_image : public image {public:    big_image(const std::string& name)         : image(name) {}    ~big_image() {}    virtual void show() {        std::cout<<"show big image:>"<<name_<<std::endl;    }   };class big_image_proxy : public image {public:    big_image_proxy(const std::string& name)         : image(name), bim(nullptr) {}    ~big_image_proxy() {        delete bim;    }     virtual void show() {        if(bim == nullptr)            bim = new big_image(name_);        bim->show();    }private:    big_image* bim;};

测试代码:

int main(){    big_image_proxy bp("hello.jpg");    bp.show();    return 0;}

上面这个代理模式就是使用一个proxy,这个proxy内部有一个big_image的指针,只要在我们需要展示图片时,这个代理才生成big_image,其他时间都只是维护一个指针而已。这样就减少了不必要的消耗。这就是需代理。

关于智能引用的代理参见这篇博客:auto_ptr源码分析。

0 0