Ben sayıl üye bazı nesneler üzerinde ve aynı zaman toplam üye (koleksiyon) de ziyaretçi desen uygulanması ile mücadele ediyorum.
Bunlar benim sahip nesneler şunlardır:
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
Gördüğünüz gibi, yapısı da özyinelemeli olacak, ama bu benim için daha sonra endişe var. ;-)
Benim soru: Beni nesneleri ve aynı zamanda sadece kendi gezilebilecek çocuklarını (koleksiyon) ziyaret sağlar ziyaretçi desen, uygulamak için en iyi yolu nedir.
Ben böyle bir arayüz oluşturma düşündüm:
VisitableAggregateInterface
{
public function getVisitableChildren(); // this would return only visitable children
}
Ve sonra Sanatçı ve WorkOfArt hem de böyle bir soyut sınıf uzatmak atalım:
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.
*/
}
Amaç bu benzer bir XML dosyası yazacak bir somut Ziyaretçi ile sona sonuçta:
<?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>
Lütfen tavsiye: Ben burada doğru yönde gidiyor muyum? getVisitableChildren()
arayüzü bana biraz tuhaf geliyor çünkü. Ben belki hatta belki tamamen ziyaretçi desen hendek ve farklı bir yaklaşım almalı mıyım?
Teşekkürler.