设计模式(12) 代理模式(PROXY)(二)
2014-11-24 02:45:36
·
作者:
·
浏览: 4
oxy : public Graphic { public: virtual ~ImageProxy(); virtual void Draw(const Point& at); virtual void HandleMouse( Event& event); virtual const Point& GetExtent(); virtual void Load(istream& from); virtual void Save(ostream& to); protected: Image* GetImage(); private: Image* _image; Point _extent; char* _fileName; }; // 构造函数保存了存储图像的文件名的本地拷贝,并初始化_extent和_image ImageProxy::ImageProxy (const char* fileName) { _fileName = strdup(fileName); _extent = Point::Zero; _image = 0; } Image* ImageProxy::GetImage() { if (_image == 0) { _image = new Image(_fileName); } } // GetExtent返回缓存的图像尺寸,否则从文件中装载图像。 const Point& ImageProxy::GetExtent () { if (_extent == Point::Zero) { _extent = GetImage()->GetExtent(); } return _extent; } // Draw用来装载图像 void ImageProxy::Draw (const Point& at) { GetImage()->Draw(at); } // HandleMouse void ImageProxy::HandleMouse (Event& event) { GetImage()->HandleMouse(event); } // Save操作将缓存的图像尺寸和文件名保存在一个流中 void ImageProxy::Save (ostream& to) { to << _extent << _fileName; } // Load得到这个信息并初始化相应的成员函数 void ImageProxy::Load (istream& from) { from >> _extent >> _fileName; } // 假设有一个client,包含Graphic对象 class TextDocument { public: TextDocument(); void Insert(Graphic*); }; 类设定完毕,我们可以通过下面的方式把ImageProxy插入到文本文件中 TextDocument* text = new TextDocument;
// ...
text->Insert(new ImageProxy("anImageFileName"));
相关模式:
- 适配器模式:为它所适配的对象提供一个不同的接口。代理模式则提供了与实际对象基本相同的接口(因为访问保护的代理可能会拒绝执行实际对象的操作,所以它的接口实际上可能是实体接口的一个子集)。
- 装饰器模式:目的不一样,装饰器为对象添加一个或多个功能,而代理模式则控制对象的访问。
参考资料: 《设计模式:可复用面向对象软件的基础》