【问题标题】:Best OO way to handle "cancel button"处理“取消按钮”的最佳 OO 方式
【发布时间】:2011-05-23 12:14:30
【问题描述】:

我一直想知道以更面向对象的方式处理取消按钮的最佳方式是什么。如果按钮被取消,我总是会匆忙地检查布尔表单属性。

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

我总是遇到这样的事情:

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

     checkIfIsCancelled();
     callAnotherFunction();

     checkIfIsCancelled();
     callAnotherFunction();

     checkIfIsCancelled();
     callAnotherFunction();
}

我希望我已经足够清楚了。我只是想要一种更简洁的方法来做到这一点:)

【问题讨论】:

    标签: oop coding-style


    【解决方案1】:

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

    取消将策略更改为 cancelledStrategy,除了一些清理之外什么都不做。下一次调用将转到 cancelledStrategy。

    通过这种方式,即使清理也非常简单,因为您确切地知道它在流程中被取消的位置。

    另一种可能的解决方案(但很大程度上取决于您的情况)是状态模式,但如果您只需要它来取消它会产生大量开销。

    【讨论】:

      【解决方案2】:

      了解您在这里使用的什么 GUI 工具包真的很有帮助。仅从这一点就不可能知道您使用的是 windows、linux 还是 mac 机器。除此之外,我想不出可以以这种方式运行的单个 GUI。

      大多数 GUI 使用“回调”模式操作创建小部件(按钮、菜单、列表框等),并且您的代码附加一个“回调”,即在小部件上执行操作时执行的片段代码或对象和方法。

      以java为例:

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

      安排消息“我被推了!”按下按钮时打印。当然,这个精简的示例省略了设置窗口、填充此小部件等所需的所有工作。

      【讨论】:

      • 我不明白为什么了解工具包或任何 UI 问题在这里很重要。如果视图和模型正确分离,那么取消方法如何到达模型层就不再是问题了。在您的示例中,回调只是一种将消息发送到模型的机制。模型如何接受来自视图的输入可以通过接口来实现。如果我理解正确的话,这个问题是关于如何将基于状态的检查与默认逻辑流分开。
      【解决方案3】:

      首先想到的是http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern,但我不确定,这里很好。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2022-12-04
          • 2018-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多