用于包装实际实现的C ++适配器类

时间:2012-09-13 17:25:16

标签: c++

目标:“包装”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;
}

1 个答案:

答案 0 :(得分:1)

你需要的成语是PIMPL (pointer-to-implementation)。 只需将UMSConnector::addEventHandler实施设置为对pImpl->addEventHandler()的调用,然后将UMSConnector::UMSConnector_impl实施移至implementation.cpp文件,并在implementation.h文件中包含interface.cpp 。这可以按你的意愿工作。