1. 程式人生 > >訪問者模式(Visitor)

訪問者模式(Visitor)

.com stat 處理 com rac code 訪問者 難了 site

訪問者模式:表示一個作用於某個對象結構中的各元素的操作。它使你可以在不改變元素的類的前提下定義作用於這些元素的新操作。

訪問者模式適用於數據結構相對穩定的系統。它吧數據結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。

訪問者模式的目的是要把處理從數據結構中分離出來。有比較穩定的數據結構,又有易於變化的算法的話,使用訪問者模式就是比較合適的。因為訪問者模式使得算法操作的增加變的容易。

它的優點是增加新的操作很容易,因為增加新的操作意味著增加一個新的訪問者。訪問這模式將有關的行為集中到一個訪問者對象中。缺點是增加新的數據機構變的困難了。

// Visitor pattern 
// Structural example using System; using System.Collections.Generic; namespace DoFactory.GangOfFour.Visitor.Structural { // MainApp test application class MainApp { static void Main() { // Setup structure ObjectStructure o = new ObjectStructure(); o.Attach(
new ConcreteElementA()); o.Attach(new ConcreteElementB()); // Create visitor objects ConcreteVisitor1 v1 = new ConcreteVisitor1(); ConcreteVisitor2 v2 = new ConcreteVisitor2(); // Structure accepting visitors o.Accept(v1); o.Accept(v2);
// Wait for user Console.ReadKey(); } } // "Visitor" abstract class Visitor { public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA); public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB); } // "ConcreteVisitor" class ConcreteVisitor1 : Visitor { public override void VisitConcreteElementA(ConcreteElementA concreteElementA) { Console.WriteLine("{0} visited by {1}",concreteElementA.GetType().Name, this.GetType().Name); } public override void VisitConcreteElementB(ConcreteElementB concreteElementB) { Console.WriteLine("{0} visited by {1}",concreteElementB.GetType().Name, this.GetType().Name); } } // "ConcreteVisitor" class ConcreteVisitor2 : Visitor { public override void VisitConcreteElementA(ConcreteElementA concreteElementA) { Console.WriteLine("{0} visited by {1}", concreteElementA.GetType().Name, this.GetType().Name); } public override void VisitConcreteElementB(ConcreteElementB concreteElementB) { Console.WriteLine("{0} visited by {1}", concreteElementB.GetType().Name, this.GetType().Name); } } // "Element" abstract class Element { public abstract void Accept(Visitor visitor); } // "ConcreteElement" class ConcreteElementA : Element { public override void Accept(Visitor visitor) { visitor.VisitConcreteElementA(this); } public void OperationA() { } } // "ConcreteElement" class ConcreteElementB : Element { public override void Accept(Visitor visitor) { visitor.VisitConcreteElementB(this); } public void OperationB() { } } // "ObjectStructure" class ObjectStructure { private List<Element> _elements = new List<Element>(); public void Attach(Element element) { _elements.Add(element); } public void Detach(Element element) { _elements.Remove(element); } public void Accept(Visitor visitor) { foreach (Element element in _elements) { element.Accept(visitor); } } } }

http://www.cnblogs.com/lsxqw2004/p/4699616.html

訪問者模式(Visitor)