2

目标:“包装”IPC 通信总线的实际实现,以允许客户端与通用 API 接口,并允许将来可能替换底层 IPC 实现。

这是我想出的。注意:我是一名 C 人,正在转向 C++。有没有更好的方法来解决这个问题?

注意:我希望客户端仅与我的包装器/接口交互,并且不需要包含任何协议特定代码或设置包含路径以实现特定于头文件。

我已经浏览了设计模式。我想我想要一个适配器/包装器模式,但是 Interface_impl 的顺序:公共接口继承需要客户端为特定的实现设置包含路径。

接口/包装器是 UMSConnector,它调用实际的实现 UMSConnector_impl。

// "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 (pointer-to-implementation)。只需将UMSConnector::addEventHandler实现设置为调用pImpl->addEventHandler()并将实现移动UMSConnector::UMSConnector_implimplementation.cpp文件中并包含implementation.hinterface.cpp文件中即可。这应该可以按您的意愿工作。

于 2012-09-13T17:38:43.953 回答