Есть TimelineView, в котором происходит нечто наподобие редактора; MainActivity, который этим TimelineView управляет, вызывая действия (new, undo, redo). И есть специализированные команды, которые можно представить как инструменты.
Для простых действий, таких как например new, проблем нет: пользователь выбирает пункт меню, в обработчике этого пункта в MainActivity просто вызываем timeline.actionNew() и получаем результат с минимальным кодом.
Но в случае с undo/redo появляются сложности. Во-первых, в классах Command нужно вызвать commitInHistory() непосредственно перед самим изменением. Этот метод должен взять из класса TimelineView данные (или сообщить ему это сделать) и сохранить их в UndoHistory. Во-вторых, нужно включить/выключить пункт меню undo/redo в MainActivity в зависимости от доступности отмены/возврата.
Делать всё на листенерах — плохая идея, потому что ими будет сложно управлять. Кроме того, текущая команда в TimelineView может меняться (поле currentCommand). Снимать/ставить обработчики при каждом переключении команды тоже непросто.
Как вариант, можно использовать EventBus. Но не понятно, как быть со сменой команд (не будет ли утечек памяти?). И, если когда-нибудь понадобится отправить событие и сразу же получить ответ от UI, справится ли EventBus с этим? Например, при выборе пункта меню Undo, послать событие onUndo и тут же вернуть результат успешности отмены или количества записей в истории, чтобы решить, стоит ли выключить этот пункт.