Your example gives us more cohesive classes/method, and eliminates the if, this means improving the performance and readability of the code and helping when doing unit testing, I am studying this in the solid principle and I'm really enjoying it. I knew your chanel via Elder's chanel. Thanks man!
I have a question! It makes sense I'm wrote a method "speak" with a String parameter that receive "portguese" or "english" so I can use switch case? And that method call another speakEnglish() or speakPortuguese()? Because in this case, I'm encapsulating the methods and clearing the option of the method speak.
The context will define it; for example, in our case, I had two languages with a super simple sentence. If I have more, I could use an enum that is more valid than a String, once I can put an invalid value in String, such as "Banana". If the logic became more complex, I could use the Strategy pattern, thus, a Language interface with some implementations.