2012-01-18 67 views
0

我有一个类MyClass,它存储PixelDescriptor *对象的集合。 MyClass的使用由策略模式样式对象指定一个函数(称之为DescriptorFunction)为每个描述符做一些事情:存储一个算法可能需要的项目集合

void MyFunction() 
{ 
descriptorA = DescriptorCollection[0]; 
for_each descriptor in DescriptorCollection 
    { 
    DescriptorFunction->DoSomething(descriptor) 
    } 
} 

但是,这仅是有道理的,如果描述符是一种类型的DescriptorFunction知道如何处理的。也就是说,并非所有的DescriptorFunction都知道如何处理所有描述符类型,但只要存储的描述符是指定访问者知道的类型,一切都很好。

如何确保计算出正确类型的描述符?更糟的是,如果策略对象需要多种类型的描述符呢?

我在想制作一个复合描述符类型,是这样的:

class CompositeDescriptor 
{ 
std::vector<PixelDescriptor*> Descriptors; 
} 

然后,CompositeDescriptor可以传递给DescriptorFunction。但是,如何确保CompositeDescriptor中存在正确的描述符?

作为一个更具体的例子,说一个描述符是颜色,另一个是强度。一种策略可能是平均颜色。另一种策略可能是平均强度。第三种策略可能是挑选较大的平均颜色或平均强度。

我想过有另一个名为DescriptorCreator的战略风格类,客户端将负责设置。如果提供了ColorDescriptorCreator,则ColorDescriptorFunction将具有它所需的所有内容。但让客户负责让这个配对正确,似乎是一个坏主意。

有什么想法/建议吗?

编辑:在回答汤姆的意见,更多的信息:

本质DescriptorFunction在图像中比较两个像素。这些比较可以通过许多方式完成(除了找到它们之间的绝对差异之外)。例如1)计算像素周围区域的相应像素的平均值(以像素为中心)。 2)计算一个发烧友的“描述符”,它通常在每个像素上产生一个向量,并按照元素的方式平均两个向量的差值。 3)比较对应于外部数据中像素位置的3D点等。

我遇到了两个问题。 1)我不想计算策略中的所有内容(如果策略只是将2个像素作为参数进行比较),因为策略必须存储大量其他数据(图像中有一个掩码涉及描述一些无效区域等等),我不认为它应该对此负责。

2)其中的一些东西计算起来很昂贵。我必须做数百万次(被比较的像素总是不同的,但每个像素的特征不会改变),所以我不想多次计算任何特征。例如,考虑策略函数比较花哨的描述符。在每次迭代中,将一个像素与所有其他像素进行比较。这意味着在第二次迭代中,所有的特征都必须重新计算,这是非常多余的。这些数据需要存储在所有策略可以访问的地方 - 这就是为什么我试图在主客户端保留一个向量。

这是否澄清了问题?感谢你目前的帮助!

回答

0

第一部分听起来像visitor pattern可能是合适的。访问者可以忽略任何不想处理的类型。

如果它们需要多个描述符类型,那么它是完全不同的抽象。你的描述有些模糊,所以很难确切地说要做什么。我怀疑你是在想这件事。我说这是因为通常为算法选择参数是一个高度关注的问题。

我认为最好的建议是尝试一下。

我会写每个算法的具体参数(或存根,如果它很好理解)。编写代码将集合转换为具体参数。如果有抽象要做,在编写你的翻译时应该是显而易见的。为这些翻译编写一些选择帮助函数通常是大部分工作的一部分。

给出描述符和一些示例声明的具体示例可能会提供足够的信息来提供更多指导。

+0

谢谢汤姆,我会尽快回复您:) – 2012-01-18 23:15:01

+0

我在原始问题的底部添加了几段。 – 2012-01-19 02:21:26