Добрый день. Хочу реализовать слабую связанность между компонентами: Parser, Service.
Parser - парсит входную строку и преобразовывает ее в структуру, с которой по интерфейсу могут работать разные Service, некоторые - будут на основе входных данных будут выводить информацию в разных форматах, некоторые - производить какие-либо расчеты и.т.д.
Структура, полученная парсером состоит из элементов трех типов:
- Collection (Может содержать другие Collection, Element1, Element2)
- Element1
- Element2
Каждый тип - имеет разные свойства и методы:
Collection
- getChilds()
- getOprion()
Element1
- getOprion2()
- isOption3()
Element3
- getOprion4()
Сначала думал использовать Composite, но в данном случае этот вариант не подходит, для реализации разной логики - нужно реализовывать разные классы сущностей наследующие интерфейс, но данный вариант не гибок, и все-таки хочется разграничить, чтобы структура отдаваемая Parser не имела логики, а все действия происходили в отдельных Service.
На ум приходит лишь вариант такого типа:
<?php
interface Parser
{
public function parse(string $input): Collection;
}
interface Collection
{
/**
* @return (Collection|Element1|Element2)[]
*/
public function getChildren(): array;
public function getOption(): bool;
}
interface Element1
{
public function getOption1(): bool;
}
interface Element2
{
public function getOption2(): string;
public function getOption3(): string;
}
class Service
{
public function do(Collection $collection)
{
foreach ($collection->getChildren() as $child){
if($child instanceof Collection){
//...
}
if($child instanceof Element1){
//...
}
if($child instanceof Element2){
//...
}
}
}
}
На сколько данный вариант имеет место? В какую сторону еще можно посмотреть?