0

我有一个可绘制的类Button。是否应将其纹理存储并隐藏在内部:

class Button {
 private:
  Texture idle, hovered, clicked;
 public:
  void draw_self(Window&, Position) const;
};
void App::draw() {
  button.draw_self(window, position);
}

...或者记住某种代理并提供一个没有灵魂的吸气剂供“更聪明”的抽象使用是否更明智?

class Button {
 private:
  std::string idle_tag, hovered_tag, clicked_tag;
 public:
  std::string const& get_texture_tag() const; // returns one of its tags
};
class Drawer {
 private:
  std::map<std::string, Texture> textures;
 public:
  void draw(std::string const&, Position) const;
};
void App::draw() {
  drawer.draw(button.get_texture_tag(), position);
}

第一种方法似乎表示Button为一个完全组成的对象,但知道绘图子模块。第二种设计摆脱了这种耦合,并且(可能)更容易并行化;然而,它Button看起来像一个愚蠢的 DTO,并且提供的界面不太方便(尽管在提供的示例中差异并不明显,但真正的例子很痛苦)。

通常首选哪个决定,为什么?是否有我没有注意到的任何可能的问题(或其他解决方案)?

4

0 回答 0