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

标签 c++ events dependency-injection

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/

相关文章:

c++ - 使用重新解释转换将结构或类保存到文件

javascript keyup 和 keydown 事件

javascript - 附加和重新附加事件处理程序

c# - 如何从统一容器中按名称获取类型的所有实例?

c++ - 为什么在重新分配失败后无法访问先前分配的内存?

C++:使用自动将类声明为函数内的变量

dependency-injection - Angular 2 typescript 中的@Inject和@Injectable有什么区别

python - 什么是依赖注入(inject)的 Pythonic 方式?

c++ - 如何在 C++ MFC 中同时打开两个对话框?

javascript - jQuery仅在已选择时删除突出显示