Как передать управление вызывающему методу - PullRequest
2 голосов
/ 26 марта 2009

Скажем, у меня есть объект Task с методом Execute. Этот метод состоит из одного-нескольких шагов, каждый из которых требует от пользователя нажатия кнопки «Продолжить», например, когда вызывается Execute, Задача указывает своему контейнеру (в данном случае, форме Windows) отобразить вводное сообщение и ждать нажатия кнопки, прежде чем перейти к шагу 2, уведомив пользователя о том, что происходит, и выполнив некоторые действия. работа.

Я не хочу, чтобы контроллер знал о шагах в задаче, неявно, например, через. вызов Execute(Steps.ShowIntro), Execute(Steps.PerformTask) и т. д. или явно, с более чем одним методом Execute, например, ExecuteIntro(), ExecuteTask() и т. Д.

В настоящее время я использую перечисление Phase, чтобы определить, какое действие необходимо выполнить при нажатии кнопки «Продолжить»:

show phase 1 intro.
set current_phase = PhaseOne.
on continue_button click
    switch current_phase
        case PhaseOne:
            show phase 1 'Now doing:' message.
            execute phase 1 task.
            show phase 2 intro.
            set phase to PhaseTwo.
        case PhaseTwo:
            show phase 2 'Now doing:' message.
            execute phase 2 task.
            show phase 3 intro.
            set phase to PhaseThree.

Ответы [ 2 ]

3 голосов
/ 26 марта 2009

Почему бы вам просто не реализовать столько классов с помощью метода Execute, сколько шагов и поместить экземпляры этих классов в очередь.

Нажав «Продолжить», вы возьмете другой экземпляр класса с помощью Execute и вызовете его.

class Task
    method execute()
        foreach task in queue execute task
    method addSubTask( task )
        add task to queue 

class ShowIntroSubTask extends Task
class ExecuteIntroSubTask extends Task
0 голосов
/ 26 марта 2009

Ответ Миколы звучит хорошо, но если вам нужна альтернатива, рассмотрите возможность передачи обратного вызова ConfirmContinuation, который Execute может использовать при необходимости (например, при переходах по шагам). Если вы хотите сохранить абстрактность, просто назовите это как NextStep и оставьте семантику до контейнера.

...