我有一个类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)其中的一些东西计算起来很昂贵。我必须做数百万次(被比较的像素总是不同的,但每个像素的特征不会改变),所以我不想多次计算任何特征。例如,考虑策略函数比较花哨的描述符。在每次迭代中,将一个像素与所有其他像素进行比较。这意味着在第二次迭代中,所有的特征都必须重新计算,这是非常多余的。这些数据需要存储在所有策略可以访问的地方 - 这就是为什么我试图在主客户端保留一个向量。
这是否澄清了问题?感谢你目前的帮助!
谢谢汤姆,我会尽快回复您:) – 2012-01-18 23:15:01
我在原始问题的底部添加了几段。 – 2012-01-19 02:21:26