Я думаю, что первый подход лучше, так как у вашего класса будет отдельный код для обработки действий. И обычно состав также лучше наследования, поэтому класс должен расширять класс или реализовывать интерфейс только в том случае, если это действительно супер тип.
Также для удобства сопровождения, скажем, у класса Foo есть новое требование - прослушивать события другого типа и затем выполнять действие, в этом случае также легко можно изменить первый класс.
Если я не беспокоюсь за ремонтопригодность, я бы предпочел пойти на анонимный класс.