This structural pattern controls the access to a class.
Looks similar to a decorator, but it instantiates the object by itself (composition).
#include <memory>
#include <iostream>
class IPictureReader {
public:
virtual void load(std::string name) = 0;
};
class PictureReader : public IPictureReader {
public:
void load(std::string name) {
std::cout << "Loading the actual image." << std::endl;
// ...
}
};
class PictureReaderProxy : public IPictureReader {
public:
PictureReaderProxy() : m_Picture(new PictureReader()) {}
void load(std::string name) {
if (m_Name != name) {
m_Picture->load(name);
m_Name = name;
}
}
private:
std::string m_Name;
std::unique_ptr<IPictureReader> m_Picture;
};
int main() {
std::unique_ptr<IPictureReader> picProxy(new PictureReaderProxy());
picProxy->load("img001.jpg"); // loads the new picture
picProxy->load("img001.jpg"); // uses the cached picture
// ...
return 0;
}