Единственное, о чем я могу подумать, если я правильно понимаю ваше испытание, это использовать Factory Design.Фабрика будет нести ответственность за предоставление ReportRunner и ReportProfile, которые соответствуют конкретному отчету на основе его оформления.
Таким образом, у вас будет класс для каждого ReportRunner и один класс для ReportProfile, очень похожий.
ReportRunner Factory должен иметь метод, который принимает оформление отчета и возвращает его ReportRunner, поэтому вы должны сделать что-то вроде:
report->setReportRunner( factoryReportRunner->getReportRunner(report->getDecorationType() );
В классе FactoryReportRunner выу нас был бы метод getReportRunner (...)
getReportRunner(decorationType){
$functionToCall = $this->'get'.decorationType.'ReportRunner';
if(function_exists($functionToCall) &&
is_callable(array($this, $functionToCall))){
return $this->$functionToCall();
}else{
//log or alert as error
}
}
Конечно, тогда вам нужно было бы иметь getDecorationReportRunner для каждого типа украшения,в этом случае: getDigestableReportRunner и getSchedulableReportRunner .То же самое относится и к фабрике для ReportProfile.Таким образом, каждый раз, когда вы добавляете новый тип оформления, все, что вам нужно, это добавить соответствующий getDecorationReportRunner и тот, который также идет с ReportProfile.