Je n'arrive pas à appliquer le modèle de visiteur sur certains objets qui ont des membres scalaires et en même temps des membres agrégés (collections).Implémentation du modèle de visiteur sur les objets agrégés
Ce sont les objets que j'ai:
Artist
- id
- name
- .. more scalar values ..
- worksOfArt <-- this is a collection as WorkOfArt instances
WorkOfArt
- id
- name
- .. more scalar values ..
- artists <-- this is a collection of Artist instances
Comme vous pouvez le voir, la structure sera également récursive, mais c'est préoccupant plus tard pour moi. ;-)
Ma question est: quelle est la meilleure façon de mettre en œuvre le modèle de visiteur, qui me permet de visiter les objets et aussi seulement leurs enfants visitables (les collections).
Je pensais que la création d'une interface comme ceci:
VisitableAggregateInterface
{
public function getVisitableChildren(); // this would return only visitable children
}
Et puis laissez l'artiste et WorkOfArt étendent une classe abstraite comme ceci:
VisitableAggregateAbstract implements VisitableAggregateInterface
{
public function accept(Visitor $visitor)
{
$visitor->visit($this);
foreach($this->getVisitableChildren() as $visitableChild)
{
$visitableChild->accept($visitor);
}
}
/*
VisitableAggregateInterface::getVisitableChildren()
will be implemented by Artist and WorkOfArt and will only
return visitable children (like collections), and not scalar values.
*/
}
L'objectif ultime est de se retrouver avec un béton Visiteur qui écrira un fichier XML similaire à celui-ci:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<artgallery>
<artists>
<artist>
<id>1</id>
<name></name>
<worksOfArt>
<workOfArt refid="11"/>
<workOfArt refid="12"/>
</worksOfArt>
<artist>
<artists>
<worksOfArt>
<workOfArt>
<id>11</id>
<artists>
<artist refid="1"/>
</artists>
<name></name>
<info><![CDATA[some info]]></info>
</workOfArt>
<workOfArt>
<id>12</id>
<artists>
<artist refid="1"/>
</artists>
<name></name>
<info><![CDATA[some info]]></info>
</workOfArt>
</worksOfArt>
</artgallery>
Veuillez nous contacter: Est-ce que je vais dans la bonne direction ici? Parce que l'interface getVisitableChildren()
me semble un peu bizarre. Devrais-je peut-être même peut-être abandonner complètement le modèle de visiteur et adopter une approche différente?
Merci.
Vous m'avez convaincu de laisser derrière moi le modèle des visiteurs. Je n'étais pas au courant que le modèle de visiteur est généralement destiné à des données récursives. J'ai décidé de suivre l'approche que vous suggérez, même si c'est un peu plus flexible, car j'ai aussi besoin de produire des fragments partiels. Mais vous ne pouviez pas le savoir. Merci. –