具有不同内部表示的查找表的最佳模式?观察者模式?

时间:2014-03-05 10:47:53

标签: c++ constructor private observer-pattern lookup-tables

我编写了自己的类LookupTable,它作为输入

  • 关键点和相应RGB值的地图

OR

  • 3个通道(红色,绿色,蓝色),每个通道内都有该通道的关键点以及红色,绿色和蓝色关键点中的相应值。

可以从不同的数据结构以不同方式构造LookupTable类。 我保留了3个内部数据结构:

1. map<point, pixel>
2. vector<pixel> 
3. struct my{
    map<float, value> red; 
    map<float, value> green;  
    map<float, value> blue; }

可以从13构建LookupTable类,并始终计算2因此“依赖”它们。

问题:

  1. 我如何知道应该从哪个数据结构(13)计算2
  2. 如果填写了第一个1,那么3已填写,如何跟踪班级中发生的事情?观察员模式似乎有点矫枉过正..
  3. 直截了当的解决方案 - 使用几个布尔值 - 不好,将来很难维护和添加新的数据表示,即使我理解这一点。
  4. 理想情况下,
  5. construct(map<point, pixel>)

    construct(struct my)
    

    只需要执行一次,而另一次需要执行 - 只需返回值

    (那些方法不是构造函数,而是私有的)

1 个答案:

答案 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);