У меня есть сценарий, где у меня есть коллекция объектов. Данные разных объектов хранятся в разных источниках данных. Я ищу шаблон проектирования для регистрации поставщиков данных (уже есть несколько поставщиков данных) для различных объектов. Мне нужна гибкость, чтобы добавить новый тип объектов и зарегистрировать обработчик для извлечения данных для этих объектов.
например. Мне нужно отобразить список городов. У меня есть информация о городе в таблице MySQL. например идентификатор, имя, штат, страна. Мне также нужно отображать информацию о погоде, которая поступает от стороннего сервиса. Мне также нужно отобразить некоторую другую информацию, которая хранится в монго. например население, уровень грамотности и т. д.
Мне нужно получить все вышеперечисленные данные от разных поставщиков данных и отобразить их в виде таблицы. Мне нужна гибкость, чтобы добавить больше типа таких данных.
Есть несколько шаблонов, которые, я думаю, могут быть использованы для решения некоторой части проблемы, например шаблон командования, шаблон наблюдателя, цепь ответственности, стратегия и т. д.
Я бы хотел, чтобы код был
$objects = [$cityMetadata, $weather, $demographic];
$dataProviderRegistry->register($cityMedatadaProvider);
$dataProviderRegistry->register($weatherDataProvider);
$dataProviderRegistry->register($demographicDataProvider);
foreach ($objects as $object) {
$data = $dataProviderRegistry->get($object);
}
Я бы хотел, чтобы DataProviderRegistry выбрал правильного поставщика для зарегистрированного объекта для обработки этого типа объекта. Я должен быть в состоянии зарегистрировать новый тип провайдера в реестре для обработки новых типов объектов.
Я не уверен, как можно применить один или несколько типов шаблонов проектирования для решения этой конкретной проблемы.
class WeatherDataProvider
{
public function getType()
{
return "Weather";
}
public function getData()
{
//fetch data
}
}
Class Weather
{
public function getType()
{
return "Weather";
}
}
class DataProviderRegistry
{
private $providers = [];
public function register(DataProviderInterface $provider)
{
$this->providers[$provider->getType()] = $provider;
}
public function get($object)
{
return $this->providers[$object->getType()]->getData();
}
}