访问者模式(Visitor):表示一个作用于某对象结构中的各种元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,便得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问对象中。缺点就是使增加新的数据结构变得困难了。
- using System;
- using System.Collections.Generic;
- /**概述:
- * 访问者模式(Visitor):表示一个作用于某对象结构中的各种元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
- * 访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,便得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
- * 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问对象中。缺点就是使增加新的数据结构变得困难了。
- */
- namespace StuDesignMode.visitor
- {
- abstract class AbsVisitor
- {
- public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
- public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
- }
- class ConcreteVisitor1 : AbsVisitor
- {
- public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
- {
- Console.WriteLine("{0}被{1}访问",concreteElementA.GetType().Name,this.GetType().Name);
- }
- public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
- {
- Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
- }
- }
- class ConcreteVisitor2 : AbsVisitor
- {
- public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
- {
- Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);
- }
- public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
- {
- Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
- }
- }
- abstract class Element
- {
- public abstract void Accept(AbsVisitor visitor);
- }
- class ConcreteElementA:Element
- {
- public override void Accept(AbsVisitor visitor)
- {
- visitor.VisitConcreteElementA(this);
- }
- }
- class ConcreteElementB:Element
- {
- public override void Accept(AbsVisitor visitor)
- {
- visitor.VisitConcreteElementB(this);
- }
- }
- class ObjectStructure
- {
- private List<Element> list = new List<Element>();
- public void Attach(Element element)
- {
- list.Add(element);
- }
- public void Detach(Element element)
- {
- list.Remove(element);
- }
- public void Accept(AbsVisitor visitor)
- {
- foreach (Element e in list)
- {
- e.Accept(visitor);
- }
- }
- }
- class ClientTest
- {
- static void Main(string[] args)
- {
- ObjectStructure o = new ObjectStructure();
- o.Attach(new ConcreteElementA());
- o.Attach(new ConcreteElementB());
- ConcreteVisitor1 v1 = new ConcreteVisitor1();
- ConcreteVisitor2 v2 = new ConcreteVisitor2();
- o.Accept(v1);
- o.Accept(v2);
- Console.WriteLine();
- }
- }
- }