2011-05-23 73 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

您可以使用命令模式與堆棧一起實現多級撤消支持。

相關問題