/// <summary> /// En este caso quien decide cómo visita es el cliente y el motivo para implantarlo así, es porque /// el cliente tiene el siguiente problema, es que no quiere que se realice cierta operación sobre /// todos los elementos de la estructura, sino sobre algunos /// </summary> private void Exec() { //... ObjectStructure objectStructure = new ObjectStructure(); objectStructure.Add(new ConcreteElementA()); objectStructure.Add(new ConcreteElementA()); objectStructure.Add(new ConcreteElementB()); objectStructure.Add(new ConcreteElementA()); //... IEnumerator <IElement> elementIterator; ConcreteVisitorA concreteVisitorA = new ConcreteVisitorA(); elementIterator = objectStructure.Iterator(); while (elementIterator.MoveNext()) { elementIterator.Current.Accept(concreteVisitorA); } //... ConcreteVisitorB concreteVisitorB = new ConcreteVisitorB(); elementIterator = objectStructure.Iterator(); while (elementIterator.MoveNext()) { elementIterator.Current.Accept(concreteVisitorB); } //... }
/// <summary> /// Aquí el visitor es el que va a visitar a la estructura. La estructura sigue teniendo los datos, /// pero en este caso cada visitor es quien decide como visitarlos. El problema que hacerlo así es que /// delego en cada visitor cómo se debe recorrer la estructura de objetos y por tanto me obliga a /// definirlo en cada visitor. /// </summary> private void exec() { //... ObjectStructure objectStructure = new ObjectStructure(); objectStructure.Add(new ConcreteElementA()); objectStructure.Add(new ConcreteElementA()); objectStructure.Add(new ConcreteElementB()); objectStructure.Add(new ConcreteElementA()); //... new ConcreteVisitorA().VisitObjectStructure(objectStructure); //... new ConcreteVisitorB().VisitObjectStructure(objectStructure); }