要应用于输入的转换链的设计模式

时间:2015-04-02 14:24:15

标签: c++ design-patterns

我正在开发一个应用程序,我有一个常见的问题,即输入某种类型并对其应用一系列转换以获得输出。

例如,我以cv::Mat的形式拍摄图像作为输入,将一个仿函数应用于它以获得std::vector<Eigen::VectorXf>形式的一堆局部特征,然后转换为全局描述符以单Eigen::VectorXf的形式出现。这只是一个例子,实际的处理链可能要长得多。

我正试图想出一种明智的方式来代表这一点。我目前正在考虑一种链接的操作列表,其中每个操作调用下一个操作,除非其next字段为空。

这是明智的前进方式吗?是否存在适用于这种情况的设计模式?

2 个答案:

答案 0 :(得分:0)

是。设计模式称为“责任链”,具体取决于您如何实现它,您提到的使用链表的内容完全有效。尝试谷歌搜索它以更好地了解它。

答案 1 :(得分:0)

[我不确定这是否适用于你,但在评论中写一点是太多了。]

在C ++中链接操作的常用方法是实际链接调用,类似于在读取/写入流时链接输入/输出操作符的方式。

假设您有一个对象O,您可以执行abc操作。然后你可以设计操作(函数)来返回对this的引用(即return *this),你可以将调用链接在一起

O.c().a().b();

这是关于如何在C ++中链接操作(函数调用)的一般解释。对于您的情况,您可能需要将数据包装在一个类中,该类充当实际操作的简单单层代理。

您可以这样做(仅限示例代码,与您的代码无关):

class integer_ops
{
public:
    integer_ops(int start_value = 0) : value(start_value)
    { }

    integer_ops& add(const int v)
    {
        value += v;
        return *this;
    }

    integer_ops& sub(const int v)
    {
        value -= v;
        return *this;
    }

    integer_ops& mul(const int v)
    {
        value *= v;
        return *this;
    }

    integer_ops& div(const int v)
    {
        value /= v;
        return *this;
    }

    int value() const
    {
        return value;
    }

private:
    int value;
};

上面的类包含int值和简单的算术运算。它可以用作:

int result = integer_ops(5).mul(2).add(10).div(2).sub(2).value();

以上代码等于

int result = (((((5) * 2) + 10) / 2) - 2);

在两种情况下都为result分配了整数值8

我希望你理解一般原则,并且可以弄清楚如何将它应用到你的案例中。