我有一个场景,我有对象的集合。不同对象的数据存储在不同的数据源中。我正在寻找设计模式来为不同的对象注册数据提供者(已经拥有多个数据提供者)。我需要灵活地添加新类型的对象和注册处理程序来获取这些对象的数据。
E.g。我需要显示城市列表。我在mysql城市表中有城市信息。例如身份证,姓名,州,国家。我需要显示来自第三方服务的天气信息。我还需要显示一些存储在mongo中的其他信息。例如人口,识字率等。
我需要从不同的数据提供者处获取所有上述数据并以表格形式显示。我需要灵活性来添加更多类型的此类数据。
我认为有几种模式可用于解决问题的某些部分,例如命令模式,观察者模式,责任链,战略等。
我希望代码
$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();
}
}
答案 0 :(得分:2)
我只想创建一个repository(或可能是多个),这将掩盖为每个实体(业务对象对象)选择正确的data mapper的逻辑。您甚至不需要实现完整的存储库。只需为您做相关部分,如果当前不需要,请省略身份图等内容。
您甚至可以对其进行设置,以便在保存或填充实体时,"存储库"选择匹配的数据映射器。基于get_class($entity)
。这样您就可以进一步简化外部接口。
在每个数据映射器中,您可以放置代码以使用您需要的任何持久性抽象(sql,缓存,休息等)。
使用存储库模式作为基础,然后根据需要进行变更。