Я думаю, что вам нужно сочетание двух шаблонов проектирования: Command и Chain of Responsibility .
В командах вы можете инкапсулировать параметры для действий и передавать данные между действиями. Вы можете записывать обработку параметров и даже выполнять отмену функций, если это необходимо. Фактически, каждый объект команды будет чем-то вроде контекста для текущей обработки действий.
Действия могут передавать управление друг другу, используя цепочку команд, где каждое действие имеет ссылку на следующее действие. После выполнения своей бизнес-логики действие вызывает следующее действие для обработки, предоставляя ему объект команды.
Чтобы сделать его расширяемым для различных классов действий, вы также можете использовать шаблонный метод шаблона при реализации цепочки ответственности. Таким образом, каждый класс действия будет подклассом некоторого супер действия, которое определит метод шаблона, в котором будет происходить некоторая предварительная обработка команды, например проверка аргументов и другие вещи. Затем будет вызван подкласс, и после этого метод шаблона передаст управление следующему действию в цепочке.
При использовании таких шаблонов вам не понадобится список действий и общий цикл для их обработки. Вы просто создаете цепочку действий, а затем вызываете метод процесса для первого действия в списке, предоставляя ему объект команды. Кроме того, при построении цепочки у вас также есть дополнительная свобода смешивать порядок действий, обрабатывая их так, как вы этого хотите. Не будет зависимости от порядка действий в списке.
Итак, в основном вам понадобятся следующие классы и интерфейсы:
public interface IAction {
public void process (Command command);
}
public class SuperAction implements IAction {
private IAction nextAction;
public void process (Command command) {
// Check command object
processAction(command);
if (nextAction != null)
nextAction.process(command);
}
public abstract processAction(Command command);
public void setNextAction(IAction action) {nextAction = action;}
}
public class ActionConstructor {
public IAction constructActoinChain() {
// construct chain and return first object
}
}
И чтобы завершить это, вам нужно определить объект Command либо с методом execute, либо без. Если без метода execute, то Command будет просто контейнером параметров, которые передаются между действиями.