我编写了自己的类LookupTable,它作为输入
OR
可以从不同的数据结构以不同方式构造LookupTable类。 我保留了3个内部数据结构:
1. map<point, pixel>
2. vector<pixel>
3. struct my{
map<float, value> red;
map<float, value> green;
map<float, value> blue; }
可以从1
或3
构建LookupTable类,并始终计算2
因此“依赖”它们。
问题:
1
或3
)计算2
?1
,那么3
已填写,如何跟踪班级中发生的事情?观察员模式似乎有点矫枉过正.. construct(map<point, pixel>)
或
construct(struct my)
只需要执行一次,而另一次需要执行 - 只需返回值
(那些方法不是构造函数,而是私有的)
答案 0 :(得分:0)
您应该只有一种方法可以在您的实施中执行操作。不需要存储不同的结构来实现相同的目标。只需通过您的公共API向用户呈现两个外观。
假设pixel
看起来像(伪代码警告):
class pixel{
float red, green, blue;
pixel(float, float, float);
float getRed();
...
}
然后你的LookupTable(顺便说一句可怕的名字...... ColourPanel或类似的东西会更具描述性):
class LookupTable{
std::map<point, pixel> pointColours;
void colourThePoint(point, pixel);
void colourThePoint(point, float, float, float);
// the pixel returned gives them "getRed" "getGreen" etc...
// So Don't Repeat Yourself (DRY) by replicating that functionality here.
pixel getThePointColout(point);
void applyManipulation(std::function<void(pixel)> manip) {
std::for_each( pointColours.begin(), pointColours.end(), manip );
}
...
}
基于您的评论我添加了一种将操作函数应用于元素的方法。 该操作函数可能如下所示:
void colourMePurple( pixel& original ){
pixel.increaseBlue(32).increaseRed(32).decreaseGreen(32);
}
将会像这样使用:
LookupTable myColours;
...
myColours.applyManipulation(colourMePurple);