GUI框架模式?

时间:2008-11-25 19:11:34

标签: user-interface frameworks

我们正在嵌入式环境中开发,并发现自己需要创建自己的UI框架。

我以前做过这个,但我有兴趣对框架的常见设计模式进行一些研究。

我认为的模式类型(有些深远):

  • 小工具焦点/散焦
  • 小工具动画
  • 元素之间的数据共享
  • 将命令附加到小部件
  • 保存状态(MVC?)

您对GUI Framework模式有什么建议阅读?

6 个答案:

答案 0 :(得分:5)

我有两个给你,回调或通知,也许这就是你所谓的“将命令附加到小部件”,不知怎的,你想对UI元素中的状态变化做出反应。需要通知控制器发生了变化。

Cocoa / UIKit有一种称为“委托”的模式和完成此操作的通知,其他模式使用回调函数或对象(Java Swing)或“信号和插槽”(QT)。

我非常有用的模式在野外不会经常出现阻止状态变化的能力,最简单的用例是输入验证,你想防止失去焦点当窗口小部件中的文本与您期望的内容不一致时,从窗口小部件。 Windows Forms曾经在某些元素上拥有它,而不是所有元素,Cocoa可以做到这一点。这可以通过在回调中使用返回值或引用参数(或指针)来实现,其中被调用者可以将其传递回原始小部件

现在将样式应用于ui元素,即更改外观而不更改功能也变得非常受欢迎QT可以做到这一点,我相信很多其他库

Gang of Four Decorator模式有时也用于增强小部件的功能,使可滚动的内容可以通过装饰器完成。这一切都取决于您需要使用UI元素的距离。祝你好运,这不是一件容易的事。

EDT:在任何地方应用MVC。第一个候选人是任何类型的列表显示,不要让他们负责保留他们正在显示的项目。这绝对适用于组合框,列表框,表格和树,您可以为文本输入实现此功能,但这可能不值得花费。

答案 1 :(得分:4)

关于经典设计模式的几点建议;我认为这些与GUI构建有关:

  • MVC pattern看得见。
  • Observer pattern;例如,View需要观察Model(知道其状态何时发生变化),Controller需要观察View(知道点击按钮的时间)。
  • Strategy pattern;在某种程度上,使用控制器作为View和Model之间的粘合剂正在选择策略。从理论上讲,您应该能够透明地切换控制器。
  • Composite pattern;您的视图就像一块窗格,小部件等等。当您需要调用类似“view.paint()”的内容时,拥有一个通用接口和迭代此集合的方法非常有用。

我知道你问过框架模式,但你仍然应该依赖这些模式,因为开发人员可能会考虑到这些概念而使用你的框架。

您的框架是否有需求/特定需求?如果你的目标平台在内存/ CPU上有限,你可能想要放弃一些“好的原则”。

答案 2 :(得分:3)

通过帮助开发SingStar PS3我学到的一些东西

  • 它有助于保持组件逻辑(按钮的工作方式)和视觉逻辑(如何渲染图像)分开。当你想出一种全新的渲染方式时,这是特别好的,它可以透明地与你的旧按钮控件一起使用。
  • 设置一种灵活的方式将应用程序中的数据源绑定到一个充满组件的页面,因此相同的组件可以显示一页上的所有歌曲或另一页上的所有照片。这就是MVC进入SingStar的地方
  • 事件调度/事件接收模型(即您订阅按钮的单击)是将页面布局绑定到代码的一种非常好的方法。如果你不小心,它可能变成spagetti。
  • 不要发明另一种编程语言来描述你的逻辑,你当前的编程语言可能很好。
  • 考虑从一个页面更改为另一个页面时的步骤。这很大程度上取决于你的内存使用情况,但可能有一个时刻,无论是加载了两个页面还是没有加载任何页面。想想这里的页面间沟通。
  • 数据驱动页面布局。允许热插拔布局(按一个键从PC重新加载),因为你将大量迭代它。

答案 3 :(得分:3)

Chain of Command模式。

GUI上下文中的示例:

interface IWidget
{
    bool HandleEvent(Event event); // returns true if event was handled
                                   // or false if event was ignored
}

class Button : IWidget
{
    public override bool HandleEvent(Event event)
    {
        switch(event.Type)
        {
            case EventType.MousePressed: DoStuff(); return true;
            case EventType.MouseScrolled: return false;
        }
    }
}

在这里,按钮不关心滚动事件,所以他们让他们的父母(命令链)处理它们。所以,如果你有一个按钮,例如一个HTML页面,用户滚动按钮,这由父窗口小部件(HTML视图)处理,整个页面滚动。

有关Qt框架中实际使用情况的示例,请参阅bool QWidget::event(QEvent*)the documentation on event filters

另见:Design Patterns in KDE。 KDE是面向对象的C ++库和软件的跨平台,开源集合,作为Linux桌面环境非常流行。这些是2003年KDE会议的幻灯片。

答案 4 :(得分:2)

Dependency Injection有时可以使用。

答案 5 :(得分:1)

研究XAML,特别是绑定。

Microsoft在干净的XML语言上做了非常好的工作来描述GUI布局,如果您使用简化版的XAML作为UI描述,您将能够使用他们的工具为设计人员模拟UI。 / p>