Visitor

http://www.dofactory.com/net/visitor-design-pattern

https://www.codeproject.com/Articles/588882/TheplusVisitorplusPatternplusExplained

Cet article explique de façon très claire l'intérêt du Visitor Pattern

Une fois mis en place, exemple d'utilisation du pattern :

Document doc = ...;
HtmlVisitor visitor = new HtmlVisitor();
doc.Accept(visitor);
Console.WriteLine("Html:\n" + visitor.Output);

Mise en place :

https://github.com/GeoffreyKnobloch/DesignPatternVisitor pour un projet exemple

public interface IVisitor {
  void Visit(PlainText docPart);
  void Visit(BoldText docPart);
  void Visit(Hyperlink docPart);
}
public class HtmlVisitor : IVisitor {
  public string Output { 
    get { return this.m_output; }
  }
  private string m_output = "";

  public void Visit(PlainText docPart) {
    this.Output += docPart.Text;
  }

  public void Visit(BoldText docPart) {
    this.m_output += "<b>" + docPart.Text + "</b>";
  }

  public void Visit(Hyperlink docPart) {
    this.m_output += "<a href=\"" + docPart.Url + "\">" + docPart.Text + "</a>";
  }
}
public abstract class DocumentPart {
  public string Text { get; private set; }
  public abstract void Accept(IVisitor visitor);
}

public class PlainText : DocumentPart { 
  public override void Accept(IVisitor visitor) {
    visitor.Visit(this);
  }
}

public class BoldText : DocumentPart { 
  public override void Accept(IVisitor visitor) {
    visitor.Visit(this);
  }
}

public class Hyperlink : DocumentPart {
  public string Url { get; private set; }

  public override void Accept(IVisitor visitor) {
    visitor.Visit(this);
  }
}

public class Document {
  private List<DocumentPart> m_parts;

  public void Accept(IVisitor visitor) {
    foreach (DocumentPart part in this.m_parts) {
      part.Accept(visitor);
    }
  }
}

Donc c'est juste que DocumentPart définit la signature de la méthode Accept qui fait que le visitor visite (la part)

Pour chaque visitor, un comportement :

Le visiteur Html veut obtenir la version html du document donc on implémente visite(DocPart) de façon à ce qu'il allimente son output avec le résultat Html.

D'ou l'utilisation finale :

Document doc = ...; //Nouveau document composé d'une liste de docpart
HtmlVisitor visitor = new HtmlVisitor(); // visitor définit telle que visite(docPart) renvoie alimente son output en html
doc.Accept(visitor); // Le doc accepte le visitor : il fait accepter le visitor à chaqueune de ses docpart qui ellent activent la visite(docpart)
Console.WriteLine("Html:\n" + visitor.Output); // Exploitation du résultat en output du visitor

Que résoud ce Design pattern ...

Le problème du Double Dispatch

results matching ""

    No results matching ""