Я по-прежнему не понимаю, какой уровень абстракции нужен. Нужно, чтобы добавление новых команд не затрагивало Listener?