In the previous chapter, we briefly already discussed dependency injection (DI). Before going on with our example, we will dig into it in a bit more detail. We will do so because the programming structure we will create heavily builds on this principle.
Objects usually do not work on their own. Most of the time, the implementation depends on the services of other classes. For example, when we want to write something to the console, we use the System class and we use the final field out and the println() method through that object. Another example is how, when we manage the table of guesses, we need Color objects and ColorManager.
When writing to the console, we may not realize the dependency because the class, being part of the JDK class library, is available all the time, and all we need to do is write System.out.println(). It may be as obvious as being...