Gudkov Konstantin 394 Map

Конечно, это не совсем объектный подход использования классов:) 

1. Конструктор желательно оставлять легковесным и не реализовывать в нем никаких действий, кроме инициализации. Потому что, его, как минимум, не вынесешь в интерфейс, не переопределишь (override). В текущей реализации ты не сможешь унаследовать Cat и избежать в нём вызова этого родительского конструктора. 
2. Если выделил по классу на команду, то можно, например, выделить интерфейс с каким-то общим методом apply(args), и собрать все команды в HashMap с командой в качестве ключа, чтобы потом не перебирать if'ами.