Igual el test te lo enviaron ayer y quizás te lo estoy resolviendo xD Lo he hecho rapidillo y seguro que hay gente que tiene mejores soluciones que esta.
Problemas:
Si añadimos un nuevo tipo de Service, por ejemplo StreamingHDService tenemos que modificar el código de getTotal() con la posibilidad de error que eso implica...
Posible solucion:
Así rápido se me ocurre que podrias añadir una funcion getPrice() a las clases StreamingService y DownloadService que básicamente llamarían al getStreamingPrice() y al getDownloadPrice() de MultimediaContent respectivamente. Esta función también la tendría el padre de manera que desde RegisteredUser llamamos a getPrice() sea el tipo de Service que sea.
Además, MultimediaContent debería tener una función abstracta o que devuelva 0 que sea getPremiumPrice(), de manera que si estamos en un MultimediaContent, nos devolverá 0 y si estamos en un PremiumContent nos devolverá additionalFee.
Esta función será llamada por las funciones getStreamingPrice() y getDownloadPrice() y se sumará al resultado previo que ya tenían.
Ahora si añadimos el StreamingHDService, lo unico que tenemos que hacer es añadir cosas, pero no modificamos nada del código anterior (principio abierto-cerrado).
También hay otra(s) solución modificando la jerarquía de MultimediaContent.