gpt4 book ai didi

c++ - 依赖注入(inject)和事件处理

转载 作者:太空宇宙 更新时间:2023-11-04 14:14:25 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com