2

目的: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;
}
4

1 に答える 1

1

必要なイディオムはPIMPL(ポインターから実装)です。UMSConnector::addEventHandler実装を呼び出しとして設定し、ファイルにインクルードして実装をファイルにpImpl->addEventHandler()移動するだけです。これはあなたが望むように動作するはずです。UMSConnector::UMSConnector_implimplementation.cppimplementation.hinterface.cpp

于 2012-09-13T17:38:43.953 に答える