2009-02-11 14 views
8

Daha sonra Renderer sınıfım için kullandığım düğümler koleksiyonum var. Ardından düğüm veya tüm koleksiyonu ziyaret edebilecek bir Ziyaretçi sınıfım var. Basit çünkü düğümler koleksiyonum, std :: listesinin birkaç ekstra yöntemi olan bir paketidir.Düğümlerin yinelenen hiyerarşisi - Ziyaretçi ve Kompozit?

Sorun (yerine basit listenin) düğümler için yapı gibi bir ağaç olması çok bir düğüm bir ebeveyne ve n çocuk sahibi olabilir istiyorum olduğunu. Renderer'a bir düğümü iletebilmek ve bu düğümü "aşağıdan" herşeye dönüştürmek istediğim için bu kullanışlı olurdu. Cevap muhtemelen Kompozit.

Ziyaretçi ve Kompozisyonu nasıl birlikte kullanabilirim? Sık sık iyi bir combo olduğunu okudum ama uygulamalarım çok kötü görünüyor ... Sth eksik.

cevap

5

Sistemimiz için uygulanan benzer bir şey var. Geometrik nesnenin hiyerarşisini oluşturmanın ve bunları birime dönüştürmenin bir yolunu istedim. Açıklamalarımı oluşturmak için birleşik desen kullandım (kök benim Düğümdü ve daha sonra türetilen bir çocuk compositeNode (düğümlerin listesi) idi.

CompositeNode, bir ziyaretçi (Ziyaretçi) kabul eden ve sonra kabul etmenizin() kabul ettiği method accept() yöntemine sahiptir. visitor-> ziyareti (bu).

Böylece ziyaretçinin hiyerarşi NodeVisitor olarak temel sınıfı vardır ve RenderVisitor (nesneler oluşturur), ReportVisitor (metne düğüm bilgisi dampingli) gibi ziyaretçileri türetilmiş. sizin temel sınıf hem tabanını kabul etmesi gerekecek ve uzman düğüm çeşitleri.

Yani evet, açılan çalışır ve ben çalışan kod var ama bu tasarım online okumak (Wiki ya da oyuncak örneği) verdiğinden daha fazla çaba gerektirir katılıyorum.

Umut bu İşte

3

yardımcı olan basit örnek:

struct NodeVisitor; 

struct Node 
{ 
    virtual ~Node() {} 
    virtual void accept(NodeVisitor &v); 
}; 

struct CompositeNode : public Node 
{ 
    virtual void accept(NodeVisitor &v); 
    std::list<NodePtr> nodes_; 
}; 

struct NodeVisitor 
{ 
    virtual ~NodeVisitor() {} 
    virtual void visit(Node &n) = 0; 
    virtual void visit(CompositeNode &cn) 
    { 
    for(std::list<NodePtr>::iterator it = cn.nodes_.begin(), end = cn.nodes_.end(); it != end; ++it) 
    { 
     (*it)->accept(*this); 
    } 
    } 
}; 
+0

Niçin "NodeVisitor" içindeki düğümlü çocukları kabul etmiyorsunuz? – user35443

+0

@ user35443: Aksi taktirde ziyaret duracaktı ve OP'in Kompozisyondaki tüm düğümleri ziyaret etmeyi gerektiren Kompozitle nasıl birleştirileceğini sorması nedeniyle, aksi halde sadece Ziyaretçi olur. Ziyaretçi hakkında bilgi: http://en.wikipedia.org/wiki/Visitor_pattern. Kompozit hakkında bilgi: http://en.wikipedia.org/wiki/Composite_pattern –

+0

Evet, ama bir süredir hiyerarşiye baktığımı ve nereye baktığımı gördüğümde düğümlerdeki bileşik üyelerin yinelemesini buldum. Ziyaretçi. – user35443

0

Eğer ziyaretçinin istiyorsanız da ağacın yapısını bilmek (örneğin Ziyaret ettiği derinlik veya ağaç kökünden gelen yol) hiyerarşik ziyaretçi modelini kullanmayı düşünebilirsiniz. Bu, uzun bir süre, c2.com wiki

adresinde açıklanmıştır. Ayrıca, 'ilgi çekmeyen' bir dalı nasıl atlayacağınızı gösterir.