Я проанализировал XML-файл в объекты, в которых каждый объект имеет отношение 1: 1 с узлом XML в файле. Это дерево объектов реализует Композитные и публичные шаблоны проектирования согласно следующей записи блога Джереми Миллер:.NET C# Visitor Pattern
Когда я перебирать дерево объектов, я сделать некоторые обработки в AcceptVisitor метод() перед двойной диспетчеризации его. В качестве части обработки некоторых объектов я вызываю определенные методы для объектов leafs/children. Теперь, когда я пересекаю дочерний объект (как часть текущей итерации), я не хочу, чтобы AcceptVisitor() дважды отправлял сообщение. (Метод двойной отправки вызова для ввода текста в выходной файл. Я хочу избежать дублирования текста в файле.) Я достиг этой функциональности с флагом, но меня не устраивает дизайн флага. Есть ли модифицированная версия шаблона Visitor для обработки этой конкретной ситуации? Любые другие идеи также приветствуются.
//Iterate object tree
public void Iterate(Root root)
{
foreach (ILeaf child in root.ChildLeaves)
{
child.AcceptVisitor(this);
}
}
//This method in child object of type ILeaf gets called when Iterate() executes.
public void AcceptVisitor(IVisitor visitor)
{
//Some child object implement ILeaf1 along with ILeaf
//I want to avoid any processing in AcceptVisitor() for objects of type ILeaf1
//once following loop executes.
//This means Iterate() should not process anyting in AcceptVisitor() for
//children of type ILeaf1.
IEnumerable<ILeaf1> children = this.ChildLeaves.OfType<ILeaf1>();
//Collection of action statements from child objects.
List<ActionStatement> statements = new List<ActionStatement>();
foreach (ILeaf1 s in children)
{
ActionStatement statement = s.Generate();
statements.Add(statement);
}
//Output action statements to TextWriter
visitor.WriteStatements(statements);
}
//ILeaf1 object method
public void AcceptVisitor(IVisitor visitor)
{
ActionStatement statement = new ActionStatement("Some Text");
//Output action statement to TextWriter
visitor.WriteStatement(statement);
}
Почему, создайте AcceptVisitor2(), конечно;) – zvolkov
Добавьте код, чтобы проиллюстрировать этот второй абзац, его неясный (по крайней мере, мне), что делает ваш Accept() и как вы хотите, чтобы он вел себя так. –
шаблоны дизайна гниют ум! – Eric