1
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”,并让 Device 在它的 c'tor 中调用它。我想知道它在 DI/IoC 专家眼中是否正确,并且很想听听所有建议。

编辑:

为了澄清,我问除了上述通过 DI 和观察者模式的方式之外,是否有更好的方式将 TransportProvider 与 Device 解耦。

4

1 回答 1

0

你有一个合理的设计。可以通过各种权衡以不同的方式在许多不同的级别上处理解耦。您的设计适用于您知道发送和接收相关的情况,但设备实例和传输实现之间没有特定的编译时关系。如果存在编译时关系,您可以使用基于策略的设计:

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());
于 2012-09-19T06:04:13.347 回答