C++适配器类来包装实际实现

C++ adapter class to wrap actual implementation

本文关键字:实现 包装 适配器 C++      更新时间:2023-10-16

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

以下是我的想法。注意:我是一个C族,正在向C++过渡。有没有更好的方法来解决这个问题?

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

我浏览了一下设计图案。我想我想要一个适配器/包装器模式,但Interface_impl:publicInterface继承的顺序要求客户端为特定的实现设置包含路径。

接口/包装器是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;
}

您需要的习惯用法是PIMPL(指向实现的指针)。只需将UMSConnector::addEventHandler实现设置为对pImpl->addEventHandler()的调用,并将UMSConnector::UMSConnector_impl实现移动到implementation.cpp文件中,同时在interface.cpp文件中包含implementation.h。这应该可以随心所欲地工作。