在我的应用程序中,我为 UI 组件及其事件管理提供了不同的类。
虽然我最初的想法是为 Window 和 Frames 设置单独的类,然后一个 Window 将具有 Frames 的组合。
并且应该有一个条目用于创建和委派在窗口或框架/控制级别发生的事件。
但是,我无法就这种模式得出结论。
因此,目前以单独的事件处理程序结束,这些事件处理程序直接链接到它们各自的 UI 框架/控件。
请指导我为这个用例选择一个好的模式。
在我的应用程序中,我为 UI 组件及其事件管理提供了不同的类。
虽然我最初的想法是为 Window 和 Frames 设置单独的类,然后一个 Window 将具有 Frames 的组合。
并且应该有一个条目用于创建和委派在窗口或框架/控制级别发生的事件。
但是,我无法就这种模式得出结论。
因此,目前以单独的事件处理程序结束,这些事件处理程序直接链接到它们各自的 UI 框架/控件。
请指导我为这个用例选择一个好的模式。
EventAggregator模式应该是您的选择。它完全将您的模块彼此分离。通过这种方式,模块不需要知道(或引用)另一个模块。
您可以在此处查看我关于同一主题的另一个(更详细)答案。
如果你不需要那么多松散耦合(例如模块之间有相互引用),你应该看看观察者模式。这是实现分布式事件处理机制的另一种方法。
您正在寻找的是Command
模式。命令模式基本上允许您将请求/消息封装到一个完整的对象中,以便请求消息的对象不必知道最终将处理请求的对象。例如,您有可以发出事件的菜单项、按钮等,基本上当您编写这些元素时,您不知道谁将处理这些事件(我假设您正在开发一个处理事件的 UI 框架)。因此,您基本上将有关事件接收者的信息编码在一个名为的类中Command
,它将引用实际的接收者。它还将有一个execute
基本上将调用域特定代码的方法。您将拥有 Command 类的各种子类,它们将处理特定的请求CopyCommand
,例如PasteCommand
等。
abstract class Command {
private Receiver receiver;
public void setReceiver(Rceceiver receiver){
this.receiver = receiver;
}
public Rceiver getReceiver(){
return this.receiver;
}
abstract execute();
}
基本上现在您可以使用api为单个UI
组件设置命令。setCommand
UI 组件将只委托给底层命令。
class Button {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void onClick(){
command.execute();
}
}
有关更多详细信息,请查看 Gof Book 中的命令模式。