Agrega nesneler üzerinde ziyaretçi desen uygulanması

0 Cevap php

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.

0 Cevap