目标:“包装”IPC 通信总线的实际实现,以允许客户端与通用 API 接口(interface),并允许 future 可能替换底层 IPC 实现。
这是我想出的。注意:我是一名转向 C++ 的 C 人员。有没有更好的方法来解决这个问题?
注意:我希望客户端仅与我的包装器/接口(interface)交互,而不需要包含任何特定于协议(protocol)的代码或设置包括实现特定头文件的路径。
我已经浏览了设计模式。我想我想要一个适配器/包装器模式,但 Interface_impl 的顺序:公共(public)接口(interface)继承要求客户端设置包括特定实现的路径。
接口(interface)/包装器是 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 (pointer-to-implementation) .
只需将 UMSConnector::addEventHandler
实现设置为对 pImpl->addEventHandler()
的调用并将 UMSConnector::UMSConnector_impl
实现移动到 implementation.cpp
文件,在 interface.cpp
文件中包含 implementation.h
。这应该可以如您所愿地工作。
关于包装实际实现的 C++ 适配器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411625/