设计模式以处理UI命令

时间:2019-01-07 10:29:07

标签: user-interface design-patterns command visitor

我正在尝试为UE4游戏实现灵活的,设计友好的UI。

UI由许多小部件和HUD类组成,该类充当游戏其余部分和UI本身之间的中介。游戏,HUD和小部件之间的通信是通过事件实现的。

我在确定用于处理UI按钮广播的事件的正确模式和/或实现方面遇到问题。

开始时,我有一些按钮,其中包含非常具体的命令,例如“暂停游戏”。我编写了一个类来表示通用命令,然后为每个所需的行为创建了一个子类。然后,我使用Visitor模式来处理事件,而又不知道具体是什么。

该设置的伪代码示例为:

button.onClicked(...)
{
    ...
    commandObject.broadcast();
    ...
}

commandObject.broadcast()
{
    ...
    eventInstance.broadcast(this); // hud listens for this call
    ...
}

hudInstance.visit(Command * command)
{
    ...
    command.acceptVisitor(this);
    ...
}

eventInstance.acceptVisitor(HUD * hud)
{
    ...
    hud.doSomething();
    ...
}

然后,我必须添加带有更多动态命令的按钮,例如“打开目标对象的上下文菜单”。因此,我不得不回过头来实现接口IHasUITarget,并使用UI Target的get / set方法。因此,现在我将指向目标的指针(从IHasUITarget对象(例如小部件)获取)存储在TargetedCommand对象(Command的子对象)中,然后在接受HUD访问者时传递目标。

button.onClicked(...)
{
    ...
    commandObject.broadcast();
    ...
}

commandObject.broadcast()
{
    ...
    eventInstance.broadcast(this); // hud listens for this call
    ...
}

hudInstance.visit(Command * command)
{
    ...
    command.acceptVisitor(this);
    ...
}

eventInstance.acceptVisitor(HUD * hud)
{
    ...
    hud.doSomethingWithTarget(target); // got it using getUITarget() when initializing the command properties
    ...
}

现在,我必须添加对“将任务x分配给目标对象”之类的命令的支持。这意味着通过接口等添加另一个参数。

我对此有问题,主要是因为我觉得自己可能会陷入困境,也因为我想在设计人员向小部件添加按钮并选择Command时强制执行正确的Command选择。与之关联的设计器接口用于按类选择所需的Command过滤器,并且该类在包含它的对象的标题(在本例中为按钮)的内部定义。如果我想限制可接受的命令,则必须制作不同类型的按钮:一个接受Command对象,一个接受CommandChildA,另一个接受CommandChildB,等等。 另一方面,如果不限制命令,则必须在调用getUITarget之前检查设计者分配了上下文菜单事件的Command对象是否实际实现了IHasUITarget。同样,如果我想初始化Command属性,则必须在进行诸如commandObject.setSomeProperty(Something * s)之类的调用之前检查Command是否实现了适当的接口。 因此,要么我将无法对接口进行编码,要么不得不添加一整套可能会或可能不会使用的类变量。

也许我正在尝试使用错误的模式。您会建议如何解决这个问题?

谢谢!

0 个答案:

没有答案