我有一个可绘制的类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,并且提供的界面不太方便(尽管在提供的示例中差异并不明显,但真正的例子很痛苦)。
通常首选哪个决定,为什么?是否有我没有注意到的任何可能的问题(或其他解决方案)?