Правильный способ составить действие как последовательность нескольких меньших действий?
У меня есть три действия, определенные так:
public class A extends AbstractAction;
public class B extends AbstractAction;
public class C extends AbstractAction;
Теперь я хочу определить гигантское действие, которое выполняет эти три действия по порядку. Я уверен, что есть лучший способ сделать это, чем сделать следующее:
public class JumboAction extends AbstractAction {
...
public void actionPerformed(ActionEvent e) {
new A().actionPerformed(null);
new B().actionPerformed(null);
new C().actionPerformed(null);
}
}
Я просто не знаю, что лучше. Может кто-нибудь, пожалуйста, укажите мне на это?
Чтобы добавить больше контекста, как предлагается в ответах, мое приложение имеет несколько элементов пользовательского интерфейса (например, узлы и ребра), и пользователь может выбрать группу узлов и выполнить с ними операции A, B, C или JumboAction.
3 ответа
Эта идея о том, что один элемент управления вызывает других, как вы делаете, мне не нравится, как будто вы путаете элемент управления с моделью (игнорируя также использование вами значения null для ActionEvents). Элемент управления должен изменять состояние модели, вызывая методы модели. Почему бы не сделать так, чтобы ваш гигантский элемент управления вызвал три (или более) метода модели или что-то еще, что требуется для выполнения его потребностей.
Возможно, вы сможете лучше понять вашу проблему, предоставив больше информации о конкретных особенностях вашей проблемы, поскольку они могут быть такими же или более важными, чем абстрактные идеи.
Мне кажется, что вы выходите за пределы цели классов Action, потому что вы передаете null методам actionPerformed.
Рассмотрите возможность инкапсуляции вашей логики выполнения (бизнес или иным образом) в отдельный набор классов классов и вызовите их из действий.
Это избавит от необходимости дублировать код и даст вам более чистые классы Action, которые делают то, что они должны делать.
Если вы хотите использовать тот же порядок, вы можете использовать другой метод, вызывающий классы бизнес-логики в заранее определенном порядке.
Также ознакомьтесь с шаблоном Command, особенно с областью макрокоманд. Возможно, вы можете извлечь выгоду из некоторой адаптации этого.
То, как вы это делаете, просто отлично.
Единственное, что я бы сделал по-другому, это замени actionPerformed(null)
с actionPerformed(e)
, Это позволило бы A
, B
, а также C
чтобы получить доступ к ActionEvent в контексте.
редактировать: если действия A
, B
, а также C
не предназначены для отдельного использования, я бы порекомендовал объединить действия в три метода в рамках JumboAction
учебный класс.