我们正在嵌入式环境中开发,并发现自己需要创建自己的UI框架。
我以前做过这个,但我有兴趣对框架的常见设计模式进行一些研究。
我认为的模式类型(有些深远):
您对GUI Framework模式有什么建议阅读?
答案 0 :(得分:5)
我有两个给你,回调或通知,也许这就是你所谓的“将命令附加到小部件”,不知怎的,你想对UI元素中的状态变化做出反应。需要通知控制器发生了变化。
Cocoa / UIKit有一种称为“委托”的模式和完成此操作的通知,其他模式使用回调函数或对象(Java Swing)或“信号和插槽”(QT)。
我非常有用的模式在野外不会经常出现阻止状态变化的能力,最简单的用例是输入验证,你想防止失去焦点当窗口小部件中的文本与您期望的内容不一致时,从窗口小部件。 Windows Forms曾经在某些元素上拥有它,而不是所有元素,Cocoa可以做到这一点。这可以通过在回调中使用返回值或引用参数(或指针)来实现,其中被调用者可以将其传递回原始小部件
现在将样式应用于ui元素,即更改外观而不更改功能也变得非常受欢迎QT可以做到这一点,我相信很多其他库
Gang of Four Decorator模式有时也用于增强小部件的功能,使可滚动的内容可以通过装饰器完成。这一切都取决于您需要使用UI元素的距离。祝你好运,这不是一件容易的事。
EDT:在任何地方应用MVC。第一个候选人是任何类型的列表显示,不要让他们负责保留他们正在显示的项目。这绝对适用于组合框,列表框,表格和树,您可以为文本输入实现此功能,但这可能不值得花费。
答案 1 :(得分:4)
关于经典设计模式的几点建议;我认为这些与GUI构建有关:
我知道你问过框架模式,但你仍然应该依赖这些模式,因为开发人员可能会考虑到这些概念而使用你的框架。
您的框架是否有需求/特定需求?如果你的目标平台在内存/ CPU上有限,你可能想要放弃一些“好的原则”。
答案 2 :(得分:3)
通过帮助开发SingStar PS3我学到的一些东西
答案 3 :(得分:3)
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>