2011-05-23 50 views
3

我一直想知道什么是以更多的OO方式处理取消按钮的最佳方式。在匆忙中,如果按钮被取消不了,那么我总是会对布尔表单属性进行难看的检查。最好的OO方式来处理“取消按钮”

事情就是这样使代码变得肮脏,在逻辑之间有很多“取消检查”。

我总是得到这样的:

void doLogic() 
{ 
    checkIfIsCancelled(); 
    callOtherFunction(); 

    checkIfIsCancelled(); 
    callAnotherFunction(); 

    checkIfIsCancelled(); 
    callAnotherFunction(); 

    checkIfIsCancelled(); 
    callAnotherFunction(); 
} 

我希望我是很清晰。我只想要一个更合适的方法来做到这一点:)

回答

1

处理此问题的正确方法是strategy pattern,其中您有一个默认策略,您可以在其中执行常规处理,并且您有一个取消策略。

取消将策略更改为仅执行一些清理操作的cancelledStrategy。下一次调用将进入cancelledStrategy。

通过这种方式,即使清理也非常简单,因为您确切知道流程中的哪个部分被取消了。

另一种可能的解决方案(但非常依赖于您的情况)将是状态模式,但是如果您只需要取消它,则会产生大量开销。

0

这将真正有助于了解什么 GUI工具包你使用这里。正因为如此,我们不可能知道您是否在使用Windows,Linux或Mac机。除此之外,我想不出一个能以这种方式运行的GUI。

大多数图形用户界面都使用“回调”模式进行操作创建小部件(按钮,菜单,列表框等),并且您的代码附加一个“回调”,一个代码或对象&在执行操作时执行的方法小部件。

在java中,例如: “我推”

Button b = JButton("Push") ; 
listener = new ActionListener()_ { 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("I was pushed!") ; 
    } 
} ; 
b.addActionListener(listener) 

安排消息当按下按钮时将被打印。当然,这个瘦身示例省略了设置窗口所需的所有工作,填充此小部件等。

+0

我不明白为什么工具包的知识或任何UI问题应该在这里重要。如果视图和模型正确分离出来,那么取消方法如何到达模型层就不再是问题。在你的例子中,回调只是一种将消息发送到模型的机制。模型如何接受来自视图的输入可以通过界面。如果我理解正确,问题是如何将基于状态的检查与默认逻辑流程分开。 – 2011-06-03 10:34:59

0

您可以使用命令模式与堆栈一起实现多级撤消支持。

相关问题