注入处理程序实现的最佳模式?

时间:2015-02-26 18:09:42

标签: c++ design-patterns

假设我有一个我想使用的第三方C ++库。它充满了Component基类的子类。 Component base具有针对无数事件的虚拟处理程序,例如onEvent()。

我想为此提供一个实现,这是一个将处理程序定义为std :: function<>的接口。 lambdas(所以我可以动态定义实现)。当然,生成的混合子类仍然可以用作其基类。

我天真的解决方案是创建一个mixin适配器模板,提供动态实现。这是我正在谈论的样本。有没有更好的方法,或者我可以遵循的更标准的习惯用法?

#include <stdio.h>
#include <functional>

// Third-party SDK

// Base class

class Component
{
public:
    virtual void onEvent(int val)
    {
    }
};

// Component subclass

class FooComponent : public Component
{
};

// My overlay interface to set an event handler

class IAdapter
{
public:
    virtual void setOnEventHandler(const std::function<void(int)>& handler) = 0;
};

// Mixin implementor -- only one is given, but there could be one for each type of handler

template <typename Base>
class AdapterImpl1 : public IAdapter, public Base
{
public:
    virtual void setOnEventHandler(const std::function<void(int)>& handler) override
    {
        m_onEventHandler = handler;
    }

    virtual void onEvent(int val) override
    {
        if (m_onEventHandler)
        {
            m_onEventHandler(val);
        }
    }

private:
    std::function<void(int)> m_onEventHandler;
};

// Final implementation. If there were more mixins, there could be for example,

class MyFooComponent : public AdapterImpl1<FooComponent>
{
};

// Main

int main() 
{
    MyFooComponent a;
    a.setOnEventHandler([](int val){
            printf("Handler val: %d\n", val);
        });

    // ...

    a.onEvent(3);

    return 0;
}

0 个答案:

没有答案