监听器等应如何管理?我发现只有一个按钮等的示例。
我可以想到以下选项:
每个类都有额外的类-看起来不正确,尤其是当项目
可以动态创建
每个组的类(例如form1,
form2,controlButtonsOnLeft,controButtonsOnRight,mainMenu,
userMenu,...)在这里,我将检查导致此问题的按钮/组件
(例如,通过getSource方法)
一些超级(大型)控制器,
它将接受所有用户操作
每个都有新的匿名课程,
这将使用参数指定来调用控制器的方法
详细信息(可能是枚举)
另一个问题:我发现了许多MVC的示例,我想知道什么对应用程序更好(或常用)。由1个人开发(应用程序不会很大)吗?
A.查看器将侦听器设置为控制器(A1-3)
B.控制器调用查看器的方法,该方法接受侦听器作为参数(方法addLoginSubmitListener,addControlBoldButtonListener等)
上面所有这些都是可以实现的,到目前为止,我将选择B4。
在Control中,我将执行以下操作:
...
viewer.addLoginButtonListener(new Listener()
{
@Override
public void actionPerformed(ActionEvent e) {
...
someButtonsActionHandler(SomeButtonEnum, ActionEnum);
...
}
});
...
private void LoginActionHandler(LoginElementsEnum elem, ActionEnum action)
{
if (elem.equals(LOGINBUTTON)) {...}
...
}
...
它结合了可读的代码(在代码的一个位置上有1个逻辑部分),不会创建任何不需要的冗余代码,不需要任何几乎不动态的检查,易于重用以及更多。
您可以确认/评论此解决方案吗?
最佳答案
老实说,这个问题归结为许多问题。
您想要可重用性吗?
您是否需要可配置性?
他们是否自我约束?也就是说,对于其他任何人来说,侦听该组件是否有意义,或者将来需要修改侦听器的结果操作?
就个人而言,我倾向于自我控制。给定动作/任务的单个侦听器。这使我更易于管理和更改。
如果我不需要(侦听器)可重用性或可配置性,那么匿名内部类通常是首选。它隐藏了功能,并且不会因使用一次小的类而使源代码混乱。您应该注意,尽管这样会使源代码难以阅读。当然,这是假定任务是有目的的(单个,孤立的情况)。通常,在这些情况下,我将更喜欢从侦听器调用实际完成工作的其他方法,这为类提供了一定程度的灵活性和可扩展性。很多时候,您发现自己想要修改组件的行为,而只是发现该行为隐藏在匿名或私有内部类中...
如果您想要可重用性和/或可配置性-即,侦听器执行一个常见任务,可以在整个程序中重复执行此任务,或者可以通过库随时间重复执行此任务,那么您将需要为该任务提供专用的类。再次,我希望使用一种自包含的解决方案,因此任何一个侦听器仅执行一项工作,更改单个侦听器要容易得多,而后又必须细查if-else
语句的复合列表:P
这也可能是一系列abstract
侦听器,它们可以为类似的操作构建功能,例如从表中删除行。
您可以考虑使用Action
API之类的东西(有关更多详细信息,请参见How to Use Actions),它们是独立的工作单元,但也带有配置信息。它们被设计为与按钮一起使用,例如JButton
和JMenuItem
,但是也可以与按键绑定一起使用,这使它们非常通用。
问题的第二部分(关于MVC)取决于。我更喜欢将与UI相关的功能尽可能地保留在视图中,而不放在控制器中。我不希望控制器直接将侦听器设置为组件,我更愿意为控制器/视图交互提供自己的专用侦听器,该侦听器会通知控制器可能希望了解的视图更改,反之亦然。
这样想吧。您可能具有登录控制器和视图,但是该控制器仅在乎从视图中获取凭据并在视图发出请求时对它们进行身份验证,而不在乎如何从视图角度提出该请求。这使您可以针对不同的情况设计不同的视图,但是只要您保持视图和控制器之间的契约,就不会有任何区别...但这仅仅是我。