c++設計モードのエージェントモード


私のこのブログの思想はすべてブログから来ています:あの誰の技術のブログ、wang_gary.彼らが私をエージェントモードに連れて行ってくれてありがとう.
設計モードに従って構想を紹介する:
意図:このオブジェクトへのアクセスを制御するために他のオブジェクトにエージェントを提供します.
適用:
1、リモートエージェント(remote proxy)は、1つのオブジェクトに異なるアドレス空間でローカルエージェントを提供する.
2、仮想エージェント(virtual proxy)、必要に応じてコストの高いオブジェクトを作成する
3、保護エージェント(protection proxy)は、元のオブジェクトへのアクセスを制御し、保護エージェントがオブジェクトに異なるアクセス権限を持つべき場合に使用される.
4、スマートポインタ(smart reference)は、簡単なポインタの代わりに、オブジェクトにアクセスする際に追加の操作を実行します.含む(1、実際のオブジェクトへの参照数、オブジェクトが参照されていない場合は自動的に解放されます.2、永続的なオブジェクトを最初に参照する場合はメモリに読み込みます.3、実際のオブジェクトにアクセスする前に、オブジェクトが変更されないようにロックされているかどうかを確認します)
参加者:
Proxy:subjectのインタフェースと同じインタフェースを提供し、エージェントがエンティティの代わりに使用できるようにします.
subject:realsubjectとproxyの共通インタフェースを定義し、realsubjectを使用する場所でproxyの代わりにproxyを使用できます.
realsubject:proxyが表すエンティティを定義する
次に、プログラムを使用して簡単に説明します.
proxy.h
//         proxy
//      http://www.cppblog.com/converse/
//  :  
/*
  :                      
           
*/

//        subject,       
//            realsubject      proxy 
class subject
{
public:
	subject(){}
	virtual ~subject(){}

public:
	virtual void Request() = 0;
};

//       
class realsubject :public subject
{
public:
	realsubject();
	virtual ~realsubject();

public:
	virtual void Request();
};

//     ,      realsubject      
class proxy :public subject
{
public:
	proxy();
	virtual ~proxy();

public:
	virtual void Request();

private:
	realsubject* pRealsubject;
};


proxy.cpp
#include <iostream>
#include "proxy.h"
using namespace std;

realsubject::realsubject()
{
	cout<<"constructing a realsubject"<<endl;
}

realsubject::~realsubject()
{
	cout<<"distory the realsubject"<<endl;
}
void realsubject::Request()
{
	cout<<"request by realsubject"<<endl;
}

proxy::proxy()
{
	pRealsubject = NULL;
	cout<<"constructing a proxy"<<endl;
}

proxy::~proxy()
{
	delete pRealsubject;
	pRealsubject = NULL;
	cout<<"distory the proxy"<<endl;
}

void proxy::Request()
{
	//    realsubject         
	if(NULL == pRealsubject)
	{
		cout<<"request by proxy"<<endl;
		pRealsubject = new realsubject();
	}

	pRealsubject->Request();
}

実際に使用する場合、私たちはこのようにすることができます.
	subject *pProxy = new proxy();
	pProxy->Request();
	delete pProxy;
	pProxy = NULL;

この小さな例では、エージェントモードの使い方がはっきりしています.次に、非常にイメージ的な例を示します.
proxy.h
/*
       ,                        
*/
//              
class loosewomen
{
public:
	loosewomen(){};
	virtual ~loosewomen(){};

public:
	//           
	virtual void makeeyeswithman() = 0;
	//       XX
	virtual void makelovewithman() = 0;

};
//       (  ),               
class wangpo:public loosewomen
{
public:
	wangpo(loosewomen *pwomen);
	~wangpo();
public:
	void makeeyeswithman();
	void makelovewithman();
private:
	loosewomen *ploosewomen;
};
//        ,   
class panjinlian:public loosewomen
{
public:
	panjinlian();
	~panjinlian();

public:
	void makeeyeswithman();
	void makelovewithman();
};
//        ,   
class xiaofengxian:public loosewomen
{
public:
	xiaofengxian();
	~xiaofengxian();

public:
	void makeeyeswithman();
	void makelovewithman();

};


proxy.cpp
wangpo::wangpo(loosewomen *pwomen)
{
	ploosewomen = pwomen;
}

wangpo::~wangpo()
{
	delete ploosewomen;
}

void wangpo::makeeyeswithman()
{
	ploosewomen->makeeyeswithman();
}
void wangpo::makelovewithman()
{
	ploosewomen->makelovewithman();
}

panjinlian::panjinlian()
{
	cout<<" panjinlian born "<<endl;
}
panjinlian::~panjinlian()
{
	cout<<"panjinlian death"<<endl;
}
void panjinlian::makeeyeswithman()
{
	cout<<"panjinlian make eyes"<<endl;
}
void panjinlian::makelovewithman()
{
	cout<<"panjinlian make love"<<endl;
}

xiaofengxian::xiaofengxian()
{
	cout<<"xiaofengxian born"<<endl;
}
xiaofengxian::~xiaofengxian()
{
	cout<<"xiaofengxian death"<<endl;
}
void xiaofengxian::makeeyeswithman()
{
	cout<<"xiaofengxian make eyes"<<endl;
}
void xiaofengxian::makelovewithman()
{
	cout<<"xiaofengxian make love"<<endl;
}

次のように使用できます.
	wangpo *pwangpo;
	pwangpo = new wangpo(new panjinlian());
	pwangpo->makeeyeswithman();
	pwangpo->makelovewithman();
	delete pwangpo;

	pwangpo = new wangpo(new xiaofengxian());
	pwangpo->makeeyeswithman();
	pwangpo->makelovewithman();
	delete pwangpo;

ここのプログラムはとても分かりやすくて、一つ一つ解析しません.