class ITransportProvider
{
public:
virtual ~ITransportProvider() { }
protected:
virtual void SendData() = 0;
// Concrete TransportProvider will call OnReceiveDataEvent
// virtual void RegisterHandlers(std::function<void()> onReceiveDataEvent);
}
class Device
{
public:
Device(shared_ptr<ITransportProvider> transport)
: m_Transport(transport)
{
// transport->RegisterHandlers(boost::bind(&Device::OnReceiveData, this));
}
void SendData()
{
m_Transport->SendData();
}
// Which design pattern to use to get concrete TransportProvider's OnReceiveData event?
//void OnReceiveData()
//{
//}
private:
shared_ptr<ITransportProvider> m_Transport;
};
我总是在我的 ITransportProvider 中添加一个“RegisterHandlers”,并让设备在其 c'tor 中调用它。 我想知道它在 DI/IoC 专家眼中是否正确,并且很想听听所有建议。
编辑:
澄清一下,我想问的是,除了上述通过 DI 和观察者模式的方式之外,是否还有更好的方式将 TransportProvider 与 Device 解耦。
最佳答案
你的设计很合理。去耦可以在许多不同的级别以不同的方式处理,并进行各种权衡。您的设计适用于您知道发送和接收相关的情况,但 Device 实例和 Transport 实现之间没有特定的编译时关系。如果存在编译时关系,您可以使用基于策略的设计:
class TransportProviderA
{
public:
void SendData();
virtual void OnReceiveData() = 0;
}
template <typename TransportPolicy>
class Device : public TransportPolicy
{
public:
Device(const TransportPolicy &transport_policy)
: TransportPolicy(transport_policy)
{
}
// SendData provided by TransportPolicy
virtual void OnReceiveData(); // overrides TransportPolicy's template method.
};
然后像这样使用它:
Device<TransportPolicyA> my_device(TransportPolicyA());
关于c++ - 依赖注入(inject)和事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12487498/