2008-11-25 126 views
5

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

我以前做过这个,但我有兴趣就框架的常用设计模式做一点研究。

的事情,我为模式的思维类型(有点深远):

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

对于GUI框架模式,建议阅读哪些内容?

回答

5

我有两个给你,回调或通知,也许这就是你所说的“附加命令的小部件”,不知何故,你想对你的UI元素的状态变化作出反应。需要通知控制器发生了变化。 Cocoa/UIKit有一个叫做“Delegation”的模式和通知来完成这个,其他的使用回调函数或对象(Java Swing)或者“信号和插槽”(QT)。

我非常有用的模式,在野外不常发生的是很容易阻止状态变化,最简单的用例就是输入验证,想要防止从小部件失去焦点时小部件中的文本与您所期望的不一致。 Windows窗体曾经在一些元素(而不是全部)上拥有这些,Cocoa可以做到这一点。这可以通过在回调函数中使用返回值或参考参数(或指针)来完成,其中被调用者可以与原始小部件进行通信

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

有四个装饰模式的Gang of有时也用于增强小部件的功能,使可滚动的东西可以通过装饰。这一切都取决于你需要走多远你的UI元素。祝你好运,这不是一件容易的事情。

EDT:无论你在哪里都可以应用MVC。第一批候选人是任何一种列表显示,不要让他们负责保留他们正在显示的项目。这绝对适用于组合框,列表框,表格和树,您可以将其实现为文本输入,但这可能不值得开销。

3

有些事情,我学会了帮助开发歌星PS3

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

研究XAML,尤其是绑定。

微软在用干净的XML语言描述GUI布局方面做得非常好,如果您使用XAML的简化版本进行UI描述,您将可以使用他们的工具为设计师模拟UI。

4

只是几个经典设计模式的指针;我认为这些都与GUI构建有关:

  • MVC pattern显然。
  • Observer pattern;例如,View需要观察Model(以了解其状态何时更改),Controller需要观察View(以了解何时单击按钮)。
  • Strategy pattern;在某种程度上,使用控制器作为视图和模型之间的粘合剂正在选择一种策略。理论上,您应该能够透明地切换控制器。
  • Composite pattern;您的视图就像一棵窗格,窗口小部件等等。当你需要调用诸如“view.paint()”之类的东西时,有一个通用接口和迭代这个集合的方法是很有用的。

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

你有你的框架要求/具体需求?如果你的目标平台在内存/ CPU上有限,你可能会想放松一些“好原则”。

3

Chain of Command图案。

例在图形用户界面的背景:

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; 
     } 
    } 
} 

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

对于Qt框架现实世界中使用的例子,请参阅bool QWidget::event(QEvent*)the documentation on event filters

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