一.简介

  访问者模式(Visitor),即表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.

二.示例类图:

设计模式学习笔记五:访问者模式_数据

三.示例代码(C#)

using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPatternsCore
{
    /// <summary>
    /// 成员接口
    /// </summary>
    public interface IElement
    {
        void Accept(IVisitor visitor);
    }
    /// <summary>
    /// 成员A
    /// </summary>
    public class ElementA : IElement
    {
        public void Accept(IVisitor visitor)
        {
            visitor.VisitElementA(this);
        }
    }
    /// <summary>
    /// 成员B
    /// </summary>
    public class ElementB : IElement
    {
        public void Accept(IVisitor visitor)
        {
            visitor.VisitElementB(this);
        }
    }
    /// <summary>
    /// 访问者接口
    /// </summary>
    public interface IVisitor
    {
        void VisitElementA(ElementA a);
        void VisitElementB(ElementB b);
    }
    /// <summary>
    /// 实际访问者
    /// </summary>
    public class Visitor : IVisitor
    {
        public void VisitElementA(ElementA a)
        {
            Console.WriteLine("visitor visit a");
        }

        public void VisitElementB(ElementB b)
        {
            Console.WriteLine("visitor visit b");
        }
    }
}

四.总结

  在访问者模式中,角色分为访问者和数据元素两类.数据元素中实现了接待访问者的方法,这些接待方法会反向调用访问者自己的具体实现;访问者中需要实现对每一种数据元素访问的具体方法.在实际调用中,可以调用访问者的访问方法访问数据元素,也可以调用数据元素的接待方法接待访问者.显然,访问者模式适用于数据元素的类型不变的情况,因为新增访问者很容易实现,但是新增数据元素却需要修改每一个已经实现的访问者类和访问者接口.访问者模式多用于编译器中.