【デザインパターン】Proxy

どんなもの?

  • 別のクラスのオブジェクトがアクセスできるように代理のクラスを提供する
  • 代理のクラスでは、ラップもしくは委譲する

どんなときに使う?

  • クラスのある一部の機能のみを実体化して使用したいとき

典型的な構成要素

  • Subject
  • RealSubject
  • Proxy
  • Client

コード

#include
#include
using namespace std;

class Subject{
public:
virtual void setName(string &name) = 0;
virtual string getName(void) = 0;
virtual int getNameSize(void) = 0;
private:
};

class RealSubject: public Subject{
public:
void setName(string &name){
this->name = name;
}
string getName(void){
return this->name;
}
int getNameSize(void){
return this->name.size();
}
private:
string name;
};

class Proxy: public Subject{
public:
void setName(string &name){
this->name = name;
}
string getName(void){
return this->name;
}

/*
* プロキシクラスはgetNameSizeを実装しない
* RealSubjectのオブジェクトを使う
*/
int getNameSize(void){
if(realsubject==NULL){
realsubject = new RealSubject();
}
realsubject->setName(this->name);
return realsubject->getNameSize();
}
private:
Subject* realsubject;
string name;
};

int main(){
Subject *sub = new Proxy();
string name = "apple";
sub->setName(name);
cout << sub->getName() << endl;
cout << sub->getNameSize() << endl;
return 0;
}