Без просмотра видео звучит как разумный дизайн. SRP не нарушен, так как методы, относящиеся к доступу к данным, не отображаются в классе ReportPrinter, только концепция, что «я могу вызвать что-то для получения нужных данных».
Вы можете продвинуться немного дальше, и у вас будет класс координатора, отвечающий только за координацию действий класса доступа к данным, класса форматирования и класса принтера. Вы также можете расположить объекты по-разному, например, если координатор отправляет данные в устройство форматирования, которое отправляет их на принтер, и координатор (напрямую) не знает о принтере.
Что-то должно знать о координации усилий узконаправленных объектов. Это становится их обязанностью. Хорошо знать идею или концепцию того, что будут делать другие объекты, если вы не знаете или не заботитесь о том, как они это делают. Думать об интерфейсах как о «швах ответственности» - хорошее начало.
Также может быть полезно, если вы думаете об объектах как о передаче данных друг другу, а не как о «выполнении» каких-либо действий. Поэтому ReportFormatter возвращает (или пересылает) новый объект, представляющий форматированный отчет, а не (концептуально) выполняет объекты в существующем отчете.