什么类型的设计模式使事件更容易?

时间:2011-12-31 15:28:54

标签: c++ design-patterns

我正在开展游戏,我发现自己有很多听众。

例如,当游戏语言发生变化时,LanguageManager会发送一个languageChanged事件,该事件会使所有感兴趣的gui元素获取新文本并重绘自己。这意味着每个感兴趣的gui元素都实现了LanguageListener类。

我发现自己做了很多事情的另一件事是注入依赖项。 GuiFactory需要设置字体,因此它有一个指向FontManager(它包含一组TTF字体)的指针,它还有一个GuiSkinManager,因此它可以根据游戏的皮肤获得Image *。这是正确的方法吗?

然而,我主要担心的是听众及其中的大量听众;特别是对于gui。我使用的gui库几乎完全是听众驱动的。我大部分时间都可以使用ActionListener但是我仍然为if.getSource()== button2等嵌套ifs。

一般来说,在比我复杂的大型游戏项目中,使用什么类型的设计模式来避免这些问题呢?

由于

2 个答案:

答案 0 :(得分:0)

监听器通常也用于大型应用程序。不要害怕他们。我正在使用最大的java应用程序之一,我在那里看到了不同听众的音调,所以它看起来就是这样。

对于较小的应用程序,Mediator如果您真的讨厌听事件,可能会出现问题;)

答案 1 :(得分:0)

如果您要遵循Observer设计模式,而不是每个事件类型包含一个回调(即LanguageListener),那么您将拥有一个接口xObserver,其中包含针对每种事件的回调。

class GuiElementObserver
{
public:
    void LanguageChangedEvent(...) {}
    void OtherEvent() {}
};

默认的空实现允许您仅在具体类中重新定义您感兴趣的事件。

关于依赖关系,每当我重构代码时,我都喜欢使用单一责任原则(http://en.wikipedia.org/wiki/Single_responsibility_principle)。你说GuiFactory需要设置字体......但是工厂真的有责任设置字体吗?

如果您将类的职责限制为他们原本打算做的事情,那么您应该拥有更精简的类,更清晰的代码和更少的依赖关系。在这种情况下,可能需要添加字体管理器并移动与字体相关的代码。