proxyパターン
「proxy=代理」
「あるクラスの代理になるクラス」を用意するためのパターン。
代理クラスは何らかの形で本人クラスを特定できる情報を持っているべき。
本人クラスインスタンスへのポインタなんかが一般的。
つべこべ言わず、いつもどおり書いてみる。
// ドライヤー基底
class DryerBase
{
public:
virtual void BlowHair(){}
};// 高性能ドライヤー
class HighPerformanceDryer : public DryerBase
{
public:
void BlowHair(){}
};// ドライヤー代理
class DryerProxy : public DryerBase
{
public:
DryerProxy(DryerBase* p)
{
m_pDryer = p;
}
~DryerProxy()
{
delete m_pDryer;
}
void BlowHair()
{
// 機能はm_pDryerのもの、こいつの代理。
m_pDryer->DryHair();
}
private:
DryerBase* m_pDryer;
};void main()
{
// 高性能ドライヤー作成
HighPerformanceDryer* pHighDryer = new HighPerformanceDryer;// 髪をブローする
pHighDryer->BlowHair();// 代理ドライヤーにブローを任せる。
DryderProxy Proxy(pHighDryer);
Proxy->BlowHair(); // 内部で判定などしてもOK// Proxyのスコープが切れることに伴いデストラクタが呼ばれるため
// pHighDryerのdeleteの必要はなし}
うん、例えをドライヤーにするのは間違いだった(笑
プロキシクラスが代理を任されているクラスインスタンスのアドレスを持っているから、自身のデストラクタ内でdeleteすることも可能なのね。
(スコープ抜ける時に解放される辺りスマートポインタっぽい)
まぁとにかく、機能は兄弟クラスインスタンスのものを使用して、そいつらの代理を
任されているイメージなのかな。