2015-04-02 94 views
0

我正在开发一个应用程序,其中我有一个常见问题,即接受某种类型的输入并向其应用转换链来获取输出。适用于输入的转换链的设计模式

例如,我采取的cv::Mat作为输入的形式的图像时,施加仿函数到它来获取的std::vector<Eigen::VectorXf>形式,其然后被转换成全局描述符在一个单一的形式一堆局部特征Eigen::VectorXf。这只是一个例子,实际的处理链可能会更长。

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

这是明智的前进方式吗?有没有适合这种情况的设计模式?

回答

0

是的。这个设计模式被称为“责任链”,取决于你如何实现它,你提到的有关使用链表的说法是完全有效的。试着用Google搜索来更好地理解它。

0

[我不知道,这适用于你,但这是有点多在评论写作。]

用C链运营++的常用方法是实际链中的通话,类似以及在读/写流时如何将输入/输出操作符链接起来。

比方说你有一个对象O,你可以执行操作a,bc上。然后,你可以设计的操作(函数)的引用返回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

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

+0

谢谢你的时间,约阿希姆。对于简单的操作,这种方法可能工作得很好,但是在大多数情况下,要应用的转换是相当大的并且彼此非常不相交。将他们全部安置在同一个班级看起来似乎过分了。 – 2015-04-02 14:49:54