目的:IPC通信バスの実際の実装を「ラップ」して、クライアントが汎用APIにインターフェイスできるようにし、基盤となるIPC実装を将来的に置き換えることができるようにします。
これが私が思いついたものです。注:私はC++に移行するC-guyです。この問題を解決するためのより良い方法はありますか?
注:クライアントがラッパー/インターフェイスとのみインターフェイスするようにし、プロトコル固有のコードや実装固有のヘッダーファイルのセットアップインクルードパスを含める必要がないようにします。
デザインパターンを調べました。アダプター/ラッパーパターンが必要だと思いますが、Interface_impl:public Interfaceの継承の順序では、クライアントが特定の実装のインクルードパスを設定する必要があります。
インターフェイス/ラッパーは、実際の実装UMSConnector_implを呼び出すUMSConnectorです。
// "interface"
class UMSConnector {
public:
static UMSConnector * instance(const string& name) {
static UMSConnector *pInstance;
if( ! pInstance ) {
pInstance = new UMSConnector(name);
return pInstance;
}
return pInstance;
}
// interface API to be implemented by UMSConnector_impl
bool addEventHandler(string event);
private:
class UMSConnector_impl;
UMSConnector_impl *pImpl;
Logger log;
string name;
UMSConnector(const string& name);
~UMSConnector();
UMSConnector(UMSConnector const& ) {}; // copy constructor
void operator=(const UMSConnector&) {}; // assignment constructor
};
UMSConnector::UMSConnector(const string& name)
: name(name) {
LOG_TRACE(log,"called");
pImpl = new UMSConnector_impl();
}
UMSConnector::~UMSConnector() {
LOG_TRACE(log,"called");
delete pImpl;
pImpl = NULL;
}
bool UMSConnector::addEventHandler(string event)
{
if( pImpl ) {
return pImpl->addEventHandler(event);
}
return false;
}
// "implementation"
class UMSConnector::UMSConnector_impl {
public:
bool addEventHandler(const string& event);
private:
Logger log;
};
bool UMSConnector::UMSConnector_impl::addEventHandler(const string& event)
{
LOG_TRACE(log,"UMSConnector_impl::addEventHandler: event=%s",event.c_str());
return true;
}